Oracle基础(七):数据库事务

一、基本概念
1、事务(Transaction):是并发控制的基本单位。所谓的事务,它是一个操作序列,这些操作要么都执行,要么都不执行,它是一个不可分割的工作单位。例如,银行转账工作:从一个账号扣款并使另一个账号增款,这两个操作要么都执行,要么都不执行。所以,应该把它们看成一个事务。事务是数据库维护数据一致性的单位,在每个事务结束时,都能保持数据一致性。

2、事务与锁
当执行事务操作时,oracle会在被作用的表上家锁,防止其他用户改表的结构。

3、事务的操作过程
1)事务的开始(默认自动开始):setAutoCommit(false)
2)设置保存点:savepoint pointAA
  • 可以设置多个保存点
  • 一旦回退以后,不能再次回退。
3)回滚到保存点(提交后无法回滚):rollback to pointAA;
4)事务提交:commit

2、事务具有以下4个基本特征。
  • Atomic(原子性):事务中包含的操作被看做一个逻辑单元,这个逻辑单元中的操作要么全部成功,要么全部失败。  
  • Consistency(一致性):只有合法的数据可以被写入数据库,否则事务应该将其回滚到最初状态。
  • Isolation(隔离性):事务允许多个用户对同一个数据进行并发访问,而不破坏数据的正确性和完整性。同时,并行事务的修改必须与其他并行事务的修改相互独立。
  • Durability(持久性):事务结束后,事务处理的结果必须能够得到固化。 
3、事务的语句
  • 开始事物:BEGIN TRANSACTION 
  • 提交事物:COMMIT TRANSACTION 
  • 回滚事务:ROLLBACK TRANSACTION
4、事务的保存点
     SAVEPOINT pointName 保存点名称 --自定义保存点的名称和位置
     ROLLBACK TO pointName  保存点名称 --回滚到自定义的保存点

二、事务隔离级别(isolation )

(一)标准事务隔离级别
1、READ UNCOMMITTED:读未提交
  • 发生脏读
2、READ COMMITTED:读已提交
  • 在trasaction A中读取数据时对记录添加共享锁,但读取结束立即释放。其它transaction B对这个记录的试图修改会一直等待直到A中的读取过程结束,而不需要整个trasaction A的结束。所以,在trasaction A的不同阶段对同一记录的读取结果可能是不同的。
  • 可能发生的问题:不可重复读。
3、REPEATABLE READ:可重复读
  • 对于读出的记录,添加共享锁直到transaction A结束。其它transaction B对这个记录的试图修改会一直等待直到trasaction A结束。  
  • 可能发生的问题:当执行一个范围查询时,可能会发生幻读。
4、SERIALIZABLE:序列化
  • 添加范围锁(比如表锁,页锁等),直到transaction A结束。以此阻止其它trasaction B对此范围内的insert,update等操作。 
  • 幻读,脏读,不可重复读等问题都不会发生。
技术分享

(二)事务的问题
1、脏读
  • 当一个事务 A 读取另一个事务B 尚未提交的修改时,产生脏读。
2、不可重复读
  • 同一查询同一事务 A 中多次进行,由于其他提交事务 B 所做的修改或者删除,每次返回不同的结果集,此时发生非重复读。
3、幻读
  • 同一查询同一事务 A 中多次进行,由于其他提交事务 B 所做的插入操作,每次返回不同的结果集,此时发生幻读。
(三)Oracle的隔离剂别
1、SQL92标准的
1)READ COMMITTED读已提交
  • 这是oracle 默认的事务隔离机制
  • 保证不会脏读,单可能出现非重复读和幻读。
2)SERIALIZABLE:序列化
  • 提供了事务看起来像队列一样一个一个顺序执行。
  • 仅仅能看到在本事务开始前由其他事务提交的更改和在本事务中所做的更改。
  • 保证不会出现脏读、不可重复读和幻读
  • serializable:提供了read-only 事务所提供的读一致性,同时又允许DML(update\insert\delete)操作
2、非SQL92标准:read-only
  • 保证不会出现脏读、不可重复读和幻读
  • 只能读,不能操作DML(update\insert\delete)操作。

(四)设置Oracle的隔离剂别
1、设置一个事务的隔离级别
  • set transcation isolation level read committed;
  • set transcation isolation level serializable;
  • set transcation read-only;
2、设置整个会话的隔离级别
  • alter session set isolation_level read committed;
  • alter session set isolation_level serializable;






















郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。