set transaction
set transaction 命令有以下功能
1、给一个事物命名
set transaction name “tname”;
2、指定一个事物使用回滚段
set transaction use rollback segment “回滚段名";
3、建立事物隔离级
set transaction isolation level serializable;如果在设置隔离级前有更新表t1没有提交,在设置隔离级后,更新表会等待,先前的提交后,隔离级里的会报错);
set transaction level read commited(默认情况的设置,如果在设置隔离级前有更新表t1没有提交,在设置隔离级后,更新表会等待,先前的提交后,隔离级里的会执行);
4、指定事物是read-only or read/write
set transaction read only;(只能读,不能进行dml操作)(只能看到设置事物前数据的变化,看不到设置事物后数据的改变)
set transaction read write;(默认情况是read write)(只能看到设置事物后数据的变化)
Restriction on Read-only Transactions Only the following statements are permitted in a read-only transaction:
Subqueries—
SELECT
statements without thefor_update_clause
LOCK
TABLE
SET
ROLE
ALTER
SESSION
ALTER
SYSTEM
DECLARE
daily_order_total NUMBER(12,2);
weekly_order_total NUMBER(12,2);
monthly_order_total NUMBER(12,2);
BEGIN
COMMIT; -- end previous transaction
SET TRANSACTION READ ONLY NAME 'Calculate Order Totals';
SELECT SUM (order_total)
INTO daily_order_total
FROM orders
WHERE order_date = SYSDATE;
SELECT SUM (order_total)
INTO weekly_order_total
FROM orders
WHERE order_date = SYSDATE - 7;
SELECT SUM (order_total)
INTO monthly_order_total
FROM orders
WHERE order_date = SYSDATE - 30;
COMMIT; -- ends read-only transaction
END;
/
set transaction语法:
一个事物隐式开始是以获取tx锁。例如 1、修改数据
2、SELECT
...FOR
UPDATE
3、使用
SET TRANSACTION
statement or theDBMS_TRANSACTION
package
以commited 或者rollback,或者执行了ddl语句隐式提交结束事物;
试验1:
1在一个session 1中执行set transaction read only,查看表t1中的数据
2在sesssion 2 中修改数据,并且提交
3在session 1中查看表t1中的数据
4 在session 1 中查看数据
SQL> set transaction read only;
事务处理集。
SQL> select *from t1;
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ------- ------------------ ---------- -------------- ---------- ---------- ----------
1 a 777 20
7369 SMITH CLERK 7902 17-12月-80 800 20
7499 ALLEN SALESMAN 7698 20-2月 -81 1600 300 30
7521 WARD SALESMAN 7698 22-2月 -81 1250 500 30
7566 JONES MANAGER 7839 02-4月 -81 2975 20
7654 MARTIN SALESMAN 7698 28-9月 -81 1250 1400 30
7698 BLAKE MANAGER 7839 01-5月 -81 2850 30
7782 CLARK MANAGER 7839 09-6月 -81 2450 10
7839 KING PRESIDENT 17-11月-81 5000 10
7844 TURNER SALESMAN 7698 08-9月 -81 1500 0 30
7900 JAMES CLERK 7698 03-12月-81 950 30
7902 FORD ANALYST 7566 03-12月-81 3000 20
7934 MILLER CLERK 7782 23-1月 -82 1300 10
已选择13行。
在session 2中修改表中的数据:
SQL> update t1 set sal=0 ;
已更新13行。
SQL> commit;
提交完成。
SQL> select *from t1;
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- -------------------- ------------------ ---------- -------------- ---------- ---------- ----------
1 a 0 20
7369 SMITH CLERK 7902 17-12月-80 0 20
7499 ALLEN SALESMAN 7698 20-2月 -81 0 300 30
7521 WARD SALESMAN 7698 22-2月 -81 0 500 30
7566 JONES MANAGER 7839 02-4月 -81 0 20
7654 MARTIN SALESMAN 7698 28-9月 -81 0 1400 30
7698 BLAKE MANAGER 7839 01-5月 -81 0 30
7782 CLARK MANAGER 7839 09-6月 -81 0 10
7839 KING PRESIDENT 17-11月-81 0 10
7844 TURNER SALESMAN 7698 08-9月 -81 0 0 30
7900 JAMES CLERK 7698 03-12月-81 0 30
7902 FORD ANALYST 7566 03-12月-81 0 20
7934 MILLER CLERK 7782 23-1月 -82 0 10
已选择13行。
查看session 1中的数据
SQL> select *from t1;
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ------- ------------------ ---------- -------------- ---------- ---------- ----------
1 a 777 20
7369 SMITH CLERK 7902 17-12月-80 800 20
7499 ALLEN SALESMAN 7698 20-2月 -81 1600 300 30
7521 WARD SALESMAN 7698 22-2月 -81 1250 500 30
7566 JONES MANAGER 7839 02-4月 -81 2975 20
7654 MARTIN SALESMAN 7698 28-9月 -81 1250 1400 30
7698 BLAKE MANAGER 7839 01-5月 -81 2850 30
7782 CLARK MANAGER 7839 09-6月 -81 2450 10
7839 KING PRESIDENT 17-11月-81 5000 10
7844 TURNER SALESMAN 7698 08-9月 -81 1500 0 30
7900 JAMES CLERK 7698 03-12月-81 950 30
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ------- ------------------ ---------- -------------- ---------- ---------- ----------
7902 FORD ANALYST 7566 03-12月-81 3000 20
7934 MILLER CLERK 7782 23-1月 -82 1300 10
已选择13行。
在session 1中更新数据:
SQL> update t1 set sal=2;
update t1 set sal=2
*
第 1 行出现错误:
ORA-01456: 不能在 READ ONLY 事务处理中执行插入/删除/更新操作
结论:1、从上述试验可以发现 设置了set transaction read only后,其他session修改t1表工资,在当前事物中的所有查询,只能看到这个事物开始前的所有变化,看不到这个事物开始后的所有表的变化。
2、set transaction read only 的当前session中只能读取数据,不能进行dml操作;
set transaction read only 不适合用在sys用户。
试验2:
1在一个session 1中执行set transaction read write,查看表t1中的数据
2在sesssion 2 中修改数据,并且提交
3在session 1中查看表t1中的数据
SQL> set transaction read write name 'aa';
事务处理集。
SQL> select *from t1;
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ------- ------------------ ---------- -------------- ---------- ---------- ----------
1 a 0 20
7369 SMITH CLERK 7902 17-12月-80 0 20
7499 ALLEN SALESMAN 7698 20-2月 -81 0 300 30
7521 WARD SALESMAN 7698 22-2月 -81 0 500 30
7566 JONES MANAGER 7839 02-4月 -81 0 20
7654 MARTIN SALESMAN 7698 28-9月 -81 0 1400 30
7698 BLAKE MANAGER 7839 01-5月 -81 0 30
7782 CLARK MANAGER 7839 09-6月 -81 0 10
7839 KING PRESIDENT 17-11月-81 0 10
7844 TURNER SALESMAN 7698 08-9月 -81 0 0 30
7900 JAMES CLERK 7698 03-12月-81 0 30
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ------- ------------------ ---------- -------------- ---------- ---------- ----------
7902 FORD ANALYST 7566 03-12月-81 0 20
7934 MILLER CLERK 7782 23-1月 -82 0 10
已选择13行。
在session 2中更新sal
SQL> update t1 set sal=1 ;
已更新13行。
SQL> commit;
提交完成。
在session 1 中查看结果
SQL> select *from t1;
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ------- ------------------ ---------- -------------- ---------- ---------- ----------
1 a 1 20
7369 SMITH CLERK 7902 17-12月-80 1 20
7499 ALLEN SALESMAN 7698 20-2月 -81 1 300 30
7521 WARD SALESMAN 7698 22-2月 -81 1 500 30
7566 JONES MANAGER 7839 02-4月 -81 1 20
7654 MARTIN SALESMAN 7698 28-9月 -81 1 1400 30
7698 BLAKE MANAGER 7839 01-5月 -81 1 30
7782 CLARK MANAGER 7839 09-6月 -81 1 10
7839 KING PRESIDENT 17-11月-81 1 10
7844 TURNER SALESMAN 7698 08-9月 -81 1 0 30
7900 JAMES CLERK 7698 03-12月-81 1 30
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ------- ------------------ ---------- -------------- ---------- ---------- ----------
7902 FORD ANALYST 7566 03-12月-81 1 20
7934 MILLER CLERK 7782 23-1月 -82 1 10
已选择13行。
结论:事物默认情况是read write的,从上述试验可以发现 设置了set transaction read write后,其他session修改工资,在当前事物中的所有查询,可以看到这个事物开始后的所有变化。
试验3:
SQL> set transaction name 'aa';
SQL> update t1 set sal=2;
已更新13行。
SQL> select xidusn,xidslot,xidsqn,used_ublk,used_urec,name from v$transaction;
XIDUSN XIDSLOT XIDSQN USED_UBLK USED_UREC NA
---------- ---------- ---------- ---------- ---------- --
25 4 241 1 1 aa
结论:可以看到事物的命名
实验:set transaction isolation level serializable name 'aa';
1在session 2中更新t1表工资,并且不提交
2在session 1 中开始串行隔离级,并且更新t1表工资,不提交
3 session 2 提交事物
4 查看session 1
session 2:
SQL> update t1 set sal=1;
已更新13行。
SQL> select *from t1;
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- -------------------- ------------------ ---------- -------------- ---------- ---------- ----------
1 a 1 20
7369 SMITH CLERK 7902 17-12月-80 1 20
7499 ALLEN SALESMAN 7698 20-2月 -81 1 300 30
7521 WARD SALESMAN 7698 22-2月 -81 1 500 30
7566 JONES MANAGER 7839 02-4月 -81 1 20
7654 MARTIN SALESMAN 7698 28-9月 -81 1 1400 30
7698 BLAKE MANAGER 7839 01-5月 -81 1 30
7782 CLARK MANAGER 7839 09-6月 -81 1 10
7839 KING PRESIDENT 17-11月-81 1 10
7844 TURNER SALESMAN 7698 08-9月 -81 1 0 30
7900 JAMES CLERK 7698 03-12月-81 1 30
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- -------------------- ------------------ ---------- -------------- ---------- ---------- ----------
7902 FORD ANALYST 7566 03-12月-81 1 20
7934 MILLER CLERK 7782 23-1月 -82 1 10
已选择13行。
session 1:
SQL> set transaction isolation level serializable name 'aa';
事务处理集。
SQL> select *from t1;
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ------- ------------------ ---------- -------------- ---------- ---------- ----------
1 a 777 20
7369 SMITH CLERK 7902 17-12月-80 800 20
7499 ALLEN SALESMAN 7698 20-2月 -81 1600 300 30
7521 WARD SALESMAN 7698 22-2月 -81 1250 500 30
7566 JONES MANAGER 7839 02-4月 -81 2975 20
7654 MARTIN SALESMAN 7698 28-9月 -81 1250 1400 30
7698 BLAKE MANAGER 7839 01-5月 -81 2850 30
7782 CLARK MANAGER 7839 09-6月 -81 2450 10
7839 KING PRESIDENT 17-11月-81 5000 10
7844 TURNER SALESMAN 7698 08-9月 -81 1500 0 30
7900 JAMES CLERK 7698 03-12月-81 950 30
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ------- ------------------ ---------- -------------- ---------- ---------- ----------
7902 FORD ANALYST 7566 03-12月-81 3000 20
7934 MILLER CLERK 7782 23-1月 -82 1300 10
已选择13行。
SQL> update t1 set sal=2;
等待中
session 2:
commit
查看session 1:
SQL> update t1 set sal=2;
update t1 set sal=2
*
第 1 行出现错误:
ORA-08177: 无法连续访问此事务处理
结论:如果在设置串行隔离级前如果修改了t1表,并且没有提交,再设置了串行隔离级后,修改t1表就会出现等待,并且如果设置隔离级之前的修改提交后,此表在隔离级里是不能被修改,会报错,这样保证了数据的一致性。
实验:set transaction isolation level READ COMMITTED
name 'aa';
1在session 2中更新t1表工资,并且不提交
2在session 1 中开始隔离级 READ COMMITTED
,并且更新t1表工资,不提交
3 session 2 提交事物
4 查看session 1
session 2:
SQL> update t1 set sal=1;
已更新13行。
session 1 :
SQL> set transaction isolation level READ COMMITTED name 'aa';
事务处理集。
SQL> select *from t1;
EMPNO ENAME JOB MGR HIREDATE SAL COMM
---------- ------- ------------------ ---------- -------------- ---------- ---------- -
1 a 777
7369 SMITH CLERK 7902 17-12月-80 800
7499 ALLEN SALESMAN 7698 20-2月 -81 1600 300
7521 WARD SALESMAN 7698 22-2月 -81 1250 500
7566 JONES MANAGER 7839 02-4月 -81 2975
7654 MARTIN SALESMAN 7698 28-9月 -81 1250 1400
7698 BLAKE MANAGER 7839 01-5月 -81 2850
7782 CLARK MANAGER 7839 09-6月 -81 2450
7839 KING PRESIDENT 17-11月-81 5000
7844 TURNER SALESMAN 7698 08-9月 -81 1500 0
7900 JAMES CLERK 7698 03-12月-81 950
EMPNO ENAME JOB MGR HIREDATE SAL COMM
---------- ------- ------------------ ---------- -------------- ---------- ---------- -
7902 FORD ANALYST 7566 03-12月-81 3000
7934 MILLER CLERK 7782 23-1月 -82 1300
已选择13行。
SQL> update t1 set sal=2;
出现等待
session 2:
SQL> commit;
提交完成。
查看session 1:
SQL> update t1 set sal=2;
已更新13行。
结论:如果在设置read commited隔离级前如果修改了t1表,并且没有提交,再设置了read commited隔离级后,修改t1表就会出现等待,并且如果设置隔离级之前的修改提交后,此表在隔离级里的等待消失,更新数据,这样保证了数据的一致性。
查看当前session的事物隔离级:
select decode(Bitand(Flag,268435456),268435456,'Serializable','Non-Serializable')
From V$Transaction, V$Session
Where Taddr=Addr and
Sid=(SELECT USERENV('SID') FROM DUAL);
DECODE(BITAND(FLAG,268435456),26
--------------------------------
Non-Serializable
SQL> set transaction isolation level serializable name 'aa';
事务处理集。
SQL> update t1 set sal=1;
已更新13行。
SQL> select decode(Bitand(Flag,268435456),268435456,'Serializable','Non-Serializable')
2 From V$Transaction, V$Session
3 Where Taddr=Addr and
4 Sid=(SELECT USERENV('SID') FROM DUAL);
DECODE(BITAND(FLAG,268435456),26
--------------------------------
Serializable
查看其他session是否隔离级
SQL> select decode(Bitand(Flag,268435456),268435456,'Serializable','Non-Serializable')
2 From V$Transaction, V$Session
3 Where Taddr=Addr and
4 Sid=162;
https://cn.forums.oracle.com/forums/thread.jspa?messageID=10713568
set transaction相关推荐
- java.lang.IllegalStateException: Cannot modify managed objects outside of a write transaction. in /U
错误内容如下 java.lang.IllegalStateException: Cannot modify managed objects outside of a write transaction ...
- redis 在 php 中的应用(事务 [ Transaction ] 篇)
本文为我阅读了 redis参考手册 之后编写,注意 php_redis 和 redis-cli 的区别(主要是返回值类型和参数用法) 目录: Transaction(事务) WATCH UNWATCH ...
- Oracle Block浅析2:ITL(Interested Transaction List)
一.ITL(Interested Transaction List): ITL(Interested Transaction List)是Oracle数据块内部的一个组成部分,位于数据块头(block ...
- Fragment提交transaction导致state loss异常
下面自从Honeycomb发布后,下面栈跟踪信息和异常信息已经困扰了StackOverFlow很久了. java.lang.IllegalStateException: Can not perform ...
- sql server 2005 T-SQL BEGIN TRANSACTION (Transact-SQL)
标记一个显式本地事务的起始点.BEGIN TRANSACTION 使 @@TRANCOUNT 按 1 递增. Transact-SQL 语法约定 语法 BEGIN { TRAN | TRANSACTI ...
- mysql中transaction的实现
transaction在数据库编程中是一个重要的概念,这样做可以控制对数据库操作的事务提交. 但是要想在程序中实现事务,要求数据库本身支持事务. 现在的关系型数据库,我们日常使用的mysql,orac ...
- ACID+CAP+BASE+Transaction(事务)
ACID+CAP+BASE+Transaction(事务) 数据库管理系统中事务(transaction)的四个特性(分析时根据首字母缩写依次解释):原子性(Atomicity).一致性(Consis ...
- CRM User Status profile中Business Transaction字段的用途
有朋友问到User Status profile中Business Transaction字段的用途,如下图INPR, FINI所示. 实际上,这个字段作为一个桥梁,连接了User Status和Sy ...
- SAP QM 执行事务代码QS51维护使用决策的选择集,系统报错 – Transaction no longer valid for catalog ‘3’ -
SAP QM 执行事务代码QS51维护使用决策的选择集,系统报错 – Transaction no longer valid for catalog '3' - 执行事务代码QS51,试图为工厂NMD ...
- We cannot activate inspection type for article master in transaction code MM41?
We cannot activate inspection type for article master in transaction code MM41? Is it possible to pl ...
最新文章
- python yaml用法详解
- matlab水印剪切攻击程序,可以运行的水印matlab程序(嵌入,提取,攻击测试等).doc
- 第二部分:浅析 Linux 初始化 init 系统:upstart
- I00029 C语言程序-打印九九乘法表
- php intval 运算,PHP Intval 的 8、7 運算 8、7 問題
- 9:01 2009-7-20
- BZOJ1196 [HNOI2006]公路修建问题 【二分 + Kruskal】
- 从零开始之驱动发开、linux驱动(二十六、三星平台framebuffer)
- java实现关注微信公众号推送模板消息
- 刀塔自走棋无限寻找服务器怎么办,刀塔自走棋无法连接服务器怎么办_刀塔自走棋无法连接服务器解决办法_玩游戏网...
- Visual Studio中输入英文会在字母之间自动增加空格
- 【mysql】mysql查询结果添加固定值
- 服务器光纤信号灯,光纤收发器的六个指示灯都代表什么?
- python多核运行程序_python单进程能否利用多核cpu的测试结论
- sparksql语法,读json
- 第一阶段项目(2 body)
- Java OpenCV 图像白平衡算法
- 上海西门子培训-第四天(周三)
- 如何安装linux_在Ubuntu系统上如何制作Linux安装U盘
- 【CRISPR-Cas9神助攻】 Cas9稳定表达细胞系、CRISPR/Cas9敲除细胞系
热门文章
- Chrome Network面板工具之万文多图详解
- java多线程归并排序_并行计算实验-串、并行排序算法
- 机器学习6-强化学习
- html有序列表序号字体大小,css – 对不同字体大小的排序列表编号进行样式化
- php7 获取客户端 ip 地址
- CESM学习笔记(CIME)1 :介绍和query_config
- UE、UI、UCD、UED?你知道你是干啥的吗
- 微信小程序抓包教程:Burpsuite版 附所需工具
- 没有期刊申请清华博士_清华大学官方:“博士生无须发表论文”理解有误!
- windows下如何查看本机所在局域网内所有可以访问的IP