一、介绍:一组SQL,一个逻辑工作单位,执行时整体修改或者整体回退
二、事务相关概念
(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 --事务中不能有任何修改数据库中数据的操作语句,这create,insert,update,delete语句
set transaction read write --默认设置,该选项表示在事务中可以有访问语句,修改语句
set transaction isolation level read committed
set transaction isolation level serializable -- serializable可以执行DML操作
注意:这些语句是互斥的,不能够同时设置两个或者两个以上的选项
(2)read only
(3)read write
(4)isolation level read committed(可幻读和重复读)
1.建立两个事务如下:
事务一:
事务二、
结论:事务2的隔离级别为 isolation level read committed, 支持不可重复读
在事务1中插入一行数据,并提交:
在事务2中查看:
结论:事务2隔离级别为 isolation level read committed, 允许幻想读
(5)isolation level serialiazble
1.建立两个事务如下:
事务一、
事务二、
结论:事务2的隔离级别为 isolation level serializable, 不支持不可重复读
在事务1中插入一行数据,并提交:
在事务2中查看:
结论:事务2的隔离级别为 isolation level serializable, 不支持幻想读
五、oracle锁机制
1、概括
(1).说明:锁机制,多个事务同时访问一个数据库对象时,该机制可以实现对并发的控制
(2).oracle中锁的类别
1.DDL锁:oracle自动的施加和释放
2.DML锁:事务开始时施加,使用commit后者rollback被释放
3.内部锁:由oracle自己管理以保护内部数据库结构
(3).oracle锁的粒度
1.行级锁:阻止该行上的DML操作,直到commit或者rollback
2.数据库级锁:
将数据库锁定为只读模式 alter database open read only;
将数据库设置为限制模式(导入导出数据库时使用):alter system enable restricted session;
2、锁的模式
(1)命令
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; --独立访问使用
(2)锁查看
select * from V$SESSION;--查看会话和锁的信息
select * from V$SESSION_WAIT;--查看等待的会话信息
select * from V$LOCK;--系统中所有锁
select * from V$LOCKED_OBJECT;--系统中DML锁
六、死锁
1、说明
(1).当两个用户希望持有对方的资源时就会发生死锁。即两个用户互相等待对方释放资源,oracle认定为产生了死锁,在这种情况下,将以牺牲一个用户作为代价,另一个用户继续执行,牺牲的用户的事务将回滚。
(2).lORA-00060的错误并记录在数据库的日志文件alertSID.log中。同时在user_dump_dest下产生了一个跟踪文件,详细描述死锁的相关信息。
2、死锁产生条件
(1)Mutual exclusion(互斥):资源不能被共享,只能由一个进程使用。
(2)Hold and wait(请求并保持):已经得到资源的进程可以再次申请新的资源。
(3)No pre-emption(不可剥夺):已经分配的资源不能从相应的进程中被强制地剥夺。
(4)Circular wait(循环等待条件):系统中若干进程组成环路,该环路中每个进程都在等待相邻进程正占用的资源。
3、解决死锁冲突
(1)执行commit或者rollback结束事务
(2)终止会话
4、事务和死锁预防总结
(1)避免应用不运行长事务。
(2)经常提交以避免长时间锁定行。
(3)避免使用LOCK命令锁定表。
(4)在非高峰期间执行DDL操作,在非高峰期间执行长时间运行的查询或事务。
另外需注意,需监测系统中死锁,调查为什么这些锁正被保持,频率;当死锁发生通过回滚事务rollback或者终止会话来解决它。
个人整理出来的Oracle事务和锁,供大家参考和学习。




