oracle事务和锁(转)
If you use a SET TRANSACTION statement, then it must be the first statement in your transaction. However, a transaction need not have a SET TRANSACTIONstatement.
Syntax
set_transaction::=

http://docs.oracle.com/cd/B28359_01/server.111/b28286/statements_10005.htm
数据库事务概括
1. 说明
一组SQL,一个逻辑工作单位,执行时整体修改或者整体回退。
2.事务相关概念
1)事务的提交和回滚:COMMIT/ROLLBACK
2)事务的开始和结束
开始事务:连接到数据库,执行DML、DCL、DDL语句
结束事务: 1. 执行DDL(例如CREATE TABLE),DCL(例如GRANT),系统自动执行COMMIT语句
2. 执行COMMIT/ROLLBACK
3. 退出/断开数据库的连接自动执行COMMIT语句
4. 进程意外终止,事务自动rollback
5. 事务COMMIT时会生成一个唯一的系统变化号(SCN)保存到事务表
3)保存点(savepoint): 可以在事务的任何地方设置保存点,以便ROLLBACK
4)事务的四个特性ACID :
1. Atomicity(原子性): 事务中sql语句不可分割,要么都做,要么都不做
2. Consistency(一致性) : 指事务操作前后,数据库中数据是一致的,数据满足业务规则约束(例如账户金额的转出和转入),与原子性对应。
3. Isolation(隔离性):多个并发事务可以独立运行,而不能相互干扰,一个事务修改数据未提交前,其他事务看不到它所做的更改。
4. Durability(持久性):事务提交后,数据的修改是永久的。
5) 死锁:当两个事务相互等待对方释放资源时,就会形成死锁,下面章节详细分析
oracle事务隔离级别
1 .两个事务并发访问数据库数据时可能存在的问题
1. 幻想读:
事务T1读取一条指定where条件的语句,返回结果集。此时事务T2插入一行新记录并commit,恰好满足T1的where条件。然后T1使用相同的条件再次查询,结果集中可以看到T2插入的记录,这条新纪录就是幻想。
2. 不可重复读取:
事务T1读取一行记录,紧接着事务T2修改了T1刚刚读取的记录并commit,然后T1再次查询,发现与第一次读取的记录不同,这称为不可重复读。
3. 脏读:
事务T1更新了一行记录,还未提交所做的修改,这个T2读取了更新后的数据,然后T1执行回滚操作,取消刚才的修改,所以T2所读取的行就无效,也就是脏数据。
2.oracle事务隔离级别
oracle支持的隔离级别:(不支持脏读)
READ COMMITTED--不允许脏读,允许幻想读和不可重复读 SERIALIZABLE--以上三种都不允许
sql标准还支持READ UNCOMMITTED (三种都允许)和 REPEATABLE READ(不允许不可重复读和脏读,只允许幻想读)
以上区别在下面章节事务建立,隔离级别分析中说明
事务相关语句
1. 事务相关语句概括

SET TRANSACTION----设置事务属性
SET CONSTRAINT -----设置约束
SAVEPOINT ------------建立存储点
RELEASE SAVEPOINT --释放存储点
ROLLBACK---------------回滚
COMMIT------------------提交

2. 建立事务、隔离级别分析
1)建立事务

SET TRANSACTION READ ONLY--事务中不能有任何修改数据库中数据的操作语句,这包括 insert、update、delete、create语句 SET TRANSACTION READ WRITE--默认设置,该选项表示在事务中可以有访问语句、修改语句 SET TRANSACTION ISOLATION LEVEL READ COMMITTED SET TRANSACTION ISOLATION LEVEL SERIALIZABLE--serialzable可以执行DML操作

注意:这些语句是互斥的,不能够同时设置两个或者两个以上的选项
2)read only
eg:
set transaction read only;
select * from student;
结果:

执行:
update student set name='小丸子' where id='ccc';
结果:

在行 3 上开始执行命令时出错:
update student set name='小丸子' where id='ccc'
错误报告:
SQL 错误: ORA-01456: 不能在 READ ONLY 事务处理中执行插入/删除/更新操作
01456. 00000 - "may not perform insert/delete/update operation inside a READ ONLY transaction"
*Cause: A non-DDL insert/delete/update or select for update operation
was attempted
*Action: commit (or rollback) transaction, and re-execute

3) read write
eg:
set transaction read write;
select * from student;

update student set name='小丸子' where id='ccc';
select * from student;
结果:
transaction READ 成功。
1 行已更新。

结论:允许读写
4)isolation level read committed(可幻读和重复读)
1.建立两个事务如下:
事务1:
set transaction read write;
select * from student;

事务2:
set transaction isolation level read committed;
select * from student;

2. 在事务1中修改某行数据并commit
update student set score=88 where id='fff';
commit;
3. 在事务2中查询结果如下:
select * from student;
结果:

结论:事务2的隔离级别为 isolation level read committed, 支持不可重复读
4. 在事务1中插入一行数据,并提交
insert into student values('iii','小梦','1',3,4,10);
5. 在事务2中查看:
select * from student;

结论:事务2隔离级别为 isolation level read committed, 允许幻想读
5) isolation level serializable
1.建立两个事务如下:
事务1:
set transaction read write;
select * from student;

事务2:
set transaction isolation level serializable;
select * from student;

2. 在事务1中修改某行数据并commit
update student set score=88 where id='fff';
commit;
3. 在事务2中查询结果如下:
select * from student;
结果:

结论:事务2的隔离级别为 isolation level serializable, 不支持不可重复读
4. 在事务1中插入一行数据,并提交
insert into student values('iii','小梦','1',3,4,10);
5. 在事务2中查看:
select * from student;

结论:事务2的隔离级别为 isolation level serializable, 不支持幻想读
ORACLE锁机制
1. 概括
1)说明
锁是一种机制,多个事务同时访问一个数据库对象时,该机制可以实现对并发的控制
2) oracle中锁的类别
1.DDL锁: oracle自动的施加和释放
2.DML锁:事务开始时施加,使用Commit后者Rollback被释放、
3.内部锁: 由oracle自己管理以保护内部数据库结构
3)oracle锁的粒度
1. 行级锁(TX):阻止该行上的DML操作,直到Commit或者Rollback
2. 表级锁(TM):
3. 数据库级锁: eg: 将数据库锁定为只读模式 alter database open read only;
eg: 将数据库设置为限制模式(导入导出数据库时使用):alter system enable restricted session;
2.锁的模式
1)概括

说明:
1. 数字越大,级别越高
2)eg:

lock table student in row share mode; lock table student in row exclusive mode; --用于行的修改 lock table student in share mode; --阻止其他DML操作 lock table student in share row exclusive mode; --阻止其他事务操作 lock table student in exclusive mode; --独立访问使用

3.锁查看
1)概括

SELECT * FROM V$SESSION;--查看会话和锁的信息 SELECT * FROM V$SESSION_WAIT;--查看等待的会话信息 SELECT * FROM V$LOCK;--系统中所有锁 SELECT * FROM V$LOCKED_OBJECT;--系统中DML锁

2)eg:
set transaction read write;
insert into student values ('jjj','小欣','1',3,4,90);
SELECT * FROM V$LOCked_object;

分析:1. locked_mode:3 ,因为我们执行的是insert, 因而是行级排他锁 row exclusive mode
死锁
1. 说明
2.死锁产生条件
1. Mutual exclusion(互斥):资源不能被共享,只能由一个进程使用。
2. Hold and wait(请求并保持):已经得到资源的进程可以再次申请新的资源。
3. No pre-emption(不可剥夺):已经分配的资源不能从相应的进程中被强制地剥夺。
4. Circular wait(循环等待条件):系统中若干进程组成环路,该环路中每个进程都在等待相邻进程正占用的资源。
3.死锁模拟
student table如下

1. 开两个进程(此处使用sqldeveloper模拟)建立两个事务
事务1:
set transaction read write;
事务2:
set transaction read write;
2. t1 时刻 事务1和事务2中分别执行如下语句
事务1:
update student set classno=8 where id='iii';
事务2:
update student set score=score+10 where id='jjj';
结果如下:
1行已更新
1行已更新
3. t2时刻事务1和事务2中分别执行如下语句
事务1:
update student set score=score+20 where id='jjj';
事务2:
update student set classno=9 where id='iii';
结果如下:

错误报告:
SQL 错误: ORA-00060: 等待资源时检测到死锁
00060. 00000 - "deadlock detected while waiting for resource"
*Cause: Transactions deadlocked one another while waiting for resources.
*Action: Look at the trace file to see the transactions and resources
involved. Retry if necessary.


注意:ScriptRunner处红色的叉,出于等待状态
4. commit 事务2,事务1结果如下:

注意:用时38.048s, 事务2commit前等待的时间
4.解决死锁冲突
1)执行commit或者rollback结束事务
2)终止会话
还是借用3中死锁的例子
在等待资源时执行,查找阻塞会话
select sid,serial#,username from v$session where sid in (select blocking_session from v$session);

执行:
alter system kill session '423,896';
结果:

在行 10 上开始执行命令时出错:
alter system kill session '423,896'
错误报告:
SQL 错误: ORA-00027: 无法终止当前会话
00027. 00000 - "cannot kill current session"
*Cause: Attempted to use ALTER SYSTEM KILL SESSION to kill the current
session.
*Action: None.

解决方法:另起一个session,关闭当前session(If it is necessary to kill the current session, do so from another session.)
另起线程执行上面的语句:
alter system kill session '423,896';
结果如下:(session kill成功,死锁解除,事务1更新成功)


5. 事务和死锁预防总结
http://www.cnblogs.com/wishyouhappy/p/3698152.html
oracle事务和锁(转)的更多相关文章
- Oracle事务与锁
Oracle事务与锁 2017-12-13 目录 1 数据库事务概括 1.1 事务定义 1.2 事务生命周期 1.3 事物的特性 1.4 死锁2 事务相关语句 2.1 事务相关语句概括 2 ...
- oracle事务和锁
数据库事务概括 1. 说明 一组SQL,一个逻辑工作单位,执行时整体修改或者整体回退. 2.事务相关概念 1)事务的提交和回滚:COMMIT/ROLLBACK 2)事务的开始和结束 开始事务:连接到数 ...
- Oracle事务与锁 知识点摘记
事务:事务用于保证数据的一致性,它由一组相关的dml语句组成,该组的dml语句要么全部成功要么全部失败. 说明:一组SQL,一个逻辑工作单位,执行整体修改或者整体回退. 事务的相关概念: 1.事务的提 ...
- Oracle事务和锁机制
事务 1. 说明 一组SQL,一个逻辑工作单位,执行时整体修改或者整体回退. 2.事务相关概念 1)事务的提交和回滚:COMMIT/ROLLBACK 2)事务的开始和结束 开始事务:连接到数据库,执行 ...
- oracle 事务简介,锁的概念,java访问数据库注意事项
java链接oracle和连接其他数据库一样有两种方式:1 桥接 jdbc-obdc2 jbdc insert语句一次插入大量数据 insert into table (列1,列2,列3) selec ...
- Oracle 事务操作
在看本文之前,请确保你已经了解了Oracle事务和锁的概念即其作用,不过不了解,请参考数据库事务的一致性和原子性浅析和Oracle TM锁和TX锁 1.提交事务 当执行使用commit语句可以提交事务 ...
- Oracle事务之一:锁和隔离
Oracle事务之一:锁和隔离 一. 事务概述 事务管理是数据库处理的核心.数据库既要保证用户能并发地执行事务,还要保证数据库的一致性. 当第一条可执行的SQL开始执行,就隐形地开始了一个事务,直到遇 ...
- 事务的隔离级别以及oracle中的锁
事务的概念及特性 事务,一般是指要做的或所做的事情.在计算机术语中是指访问并可能更新数据库中各种数据项的一个程序执行单元(unit). 例如:在关系数据库中,一个事务可以是一条SQL语句,一组SQL语 ...
- oracle 事务 锁机制
原文地址:http://www.cnblogs.com/quanweiru/archive/2013/05/24/3097367.html 本课内容属于Oracle高级课程范畴,内容略微偏向理论性,但 ...
随机推荐
- 你能相信吗?这些都是由一个DIV元素实现的动画,纯CSS3技术
http://www.webhek.com/misc/css-loaders
- JavaSE学习总结第24天_多线程2
24.01 JDK5之后的Lock锁的概述和使用 虽然我们可以理解同步代码块和同步方法的锁对象问题,但是我们并没有直接看到在哪里加上了锁,在哪里释放了锁,为了更清晰的表达如何加锁和释放锁,JDK ...
- BZOJ 3175: [Tjoi2013]攻击装置( 匈牙利 )
黑白染成二分图, 然后不能同时选的就连边, 最大匹配数为m, t为不能放的数目, 则题目所求最大点独立集为 n*n-m-t -------------------------------------- ...
- BZOJ 1669: [Usaco2006 Oct]Hungry Cows饥饿的奶牛( LIS )
裸的LIS ----------------------------------------------------------------- #include<cstdio> #incl ...
- DLL运行时动态加加载的问题
1.error C2440: 'initializing' : cannot convert from 'int (__stdcall *)(void)' to 'void (__cdecl *)(c ...
- easyui好例子,值得借鉴
http://www.cnblogs.com/wuhuacong/p/3317223.html
- logback自定义格式转换器
创建自定义格式转换符有两步. 首先,必须继承ClassicConverter类.ClassicConverter对象负责从ILoggingEvent 提取信息,并产生一个字符串.例如,LoggerCo ...
- Android图像篇
Android的渲染分为2D渲染和3D渲染两种,当中2D渲染的引擎为Skia.3D渲染的引擎是OpenGL ES.眼下.Android支持OpenGL ES1.0和OpenGL ES 2.0两种标准. ...
- Zend Studio 10.6.0汉化教程(图文)
来源于:http://www.pw88.com/teach/bangong/32.html 此汉化方法适用于所有的zend studio版本.整个汉化思路是:在线或者离线官方下载汉化包,本地安装即 ...
- cygwin中vim的使用方法
vim类似Windows中的记事本,功能非常强大. vim的使用技巧 1.vim text.txt text存在则打开,不存在则类似新建一个叫text的txt文件 2.退出 按esc切换到命令模式,然 ...