Oracle数据库事务详解

什么是事务
事务是访问数据库的一个操作序列,数据库应用系统通过事务集来完成对数据库的存取。事务的正确执行使得数据库从一种状态转换为另一种状态。
事务必须服从ISO/IEC所制定的ACID原则。ACID是原子性(atomicity)、一致性(consistency)、隔离性(isolation)、持久性(durability)的缩写,这四种状态的意思是:
1、原子性
一个事务是一个不可分割的工作单位,事务中包括的诸操作要么都做,要么都不做。
如果事务的所有子事务全部提交成功,则所有的数据库操作被提交,数据库状态发生变化;如果有子事务失败,则其他子事务的数据库操作被回滚,即数据库回到事务执行前的状态,不会发生状态转换
2、一致性
事务的执行使得数据库从一种正确状态转换成另外一种正确状态,一致性与原子性是密切相关的。
3、隔离性
一个事务的执行不能被其他事务干扰。即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰。
4、持久性
持久性也称永久性(permanence),指一个事务一旦提交,它对数据库中数据的改变就应该是永久性的。接下来的其他操作或故障不应该对其有任何影响。

隔离级别
ACID这4个特征中,最难理解的是隔离性。在标准SQL规范中,定义了4个事务隔离级别,不同的隔离级别对事务的处理不同。4个隔离级别分别是:读未提及(READ_UNCOMMITTED)、读已提交(READ_COMMITTED)、可重复读(REPEATABLE_READ)、顺序读(SERIALIZABLE)。

  1. 读未提及(READ_UNCOMMITTED)
    读未提及,该隔离级别允许脏读取,其隔离级别是最低的。换句话说,如果一个事务正在处理某一数据,并对其进行了更新,但同时尚未完成事务,因此还没有提交事务;而以此同时,允许另一个事务也能够访问该数据。
    脏读示例:
    在事务A和事务B同时执行时可能会出现如下场景:
    在这里插入图片描述
    余额应该为1500元才对。请看T5时间点,事务A此时查询的余额为0,这个数据就是脏数据,他是事务B造成的,很明显是事务没有进行隔离造成的。
  2. 读已提交(READ_COMMITTED)
    读已提交是不同的时候执行的时候只能获取到已经提交的数据。
    这样就不会出现上面的脏读的情况了。
    不可重复读示例
    可是解决了脏读问题,但是还是解决不了可重复读问题。在这里插入图片描述
    事务A其实除了查询两次以外,其它什么事情都没做,结果钱就从1000编程0了,这就是不可重复读的问题。
  3. 可重复读(REPEATABLE_READ)
    可重复读就是保证在事务处理过程中,多次读取同一个数据时,该数据的值和事务开始时刻是一致的。因此该事务级别进制了不可重复读取和脏读,但是有可能出现幻读的数据。
    幻读
    幻读就是指同样的事务操作,在前后两个时间段内执行对同一个数据项的读取,可能出现不一致的结果。
    在这里插入图片描述
    银行工作人员在一个事务中多次统计总存款时看到结果不一样。如果要解决幻读,那只能使用顺序读了。
  4. 顺序读(SERIALIZABLE)
    顺序读是最严格的事务隔离级别。它要求所有的事务排队顺序执行,即事务只能一个接一个地处理,不能并发。
    事务隔离级别对比事务隔离级别 脏 读 不可重复读 幻 读读未提及(READ_UNCOMMITTED) 允许 允许 允许读已提交(READ_COMMITTED) 禁止 允许 允许可重复读(REPEATABLE_READ) 禁止 禁止 允许顺序读(SERIALIZABLE) 禁止 禁止 禁止

注意:
4种事务隔离级别从上往下,级别越高,并发性越差,安全性就越来越高。
一般数据默认级别是读以提交或可重复读。

资料参考:https://www.jianshu.com/p/aa35c8703d61

mysql事物的4种隔离级别:
https://www.cnblogs.com/snsdzjlz320/p/5761387.html

发布了28 篇原创文章 · 获赞 2 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/u012733521/article/details/92408917