如何理解数据库事务?我的回答是:

#数据库事务(简称‘事务’)
数据库事务是指作为单个逻辑工作单元执行的一系列数据库操作

#事务的特性
ACID(Atomicity-原子性;Consistency-一致性;Isolation-隔离性;Durability-持久性)

  • **原子性:**把整个事务执行看作一个不可再分的原子,也就是整个事务里的操作要么全部执行,要么都不执行(回滚-ROLLBACK)
  • **一致性:**事务开始前和结束后,数据库原有的物理约束和逻辑约束保持一致(物理约束-外键,非空、唯一性约束等;逻辑约束-根据自己的业务逻辑而定,由开发人员保证)
  • **隔离性:**在并发环境下,各个事务执行过程中应该是相互隔离的。换句话说,如果两个事务同时操作同一条数据,事务1看到的数据要么是事务2修改之前的,要么是事务2修改之后的,不会看到事务2修改中间状态的数据
  • **持久性:**一旦事务提交,事务的所有的操作就都在数据库里面生效了,数据持久存在。(事务执行中,临时数据会保存到事务日志文件中,以便提交或回滚)

#最重要的隔离级别
隔离级别由低到高分别为Read uncommitted 、Read committed 、Repeatable read 、Serializable 。

-Read uncommitted 读未提交
如何理解数据库事务?我的回答是:_第1张图片
可以读取另一事务未提交的数据,违背了隔离性的原则,出现脏读;
脏读:事务1读取到了事务2的中间状态数据,事务2有可能再次修改此数据或回滚,导致事务1读取到的这个数据是脏数据;

-Read committed 读提交(Sql Server , Oracle默认隔离级别)
如何理解数据库事务?我的回答是:_第2张图片
只能读取到另一个事务开始前或提交后的数据,解决脏读,出现不可重复读;
不可重复读:由于事务2的修改操作,事务1对同一数据的两次读取结果不一致;

-Repeatable-Read 重复读(mysql默认隔离级别)
如何理解数据库事务?我的回答是:_第3张图片
开始读取操作时,不再允许另一事务修改数据,但是允许新添数据,解决不可重复读,出现幻读;
2019.3.5记录:修正以上解释,重复读的隔离级别是在事务1开始时创建一个数据库快照,于是事务1所能操作和看到的数据都是这个快照里面的数据。事务2修改数据不会影响事务1,因此解决了脏读和不可重复读。不过如果事务2新增了数据,事务1仍然能查询到这条新增的数据,于是出现幻读。
幻读:由于事务2的新增操作,事务1的两次读取操作结果数量不一致,无缘无故多出了一条,就像出现幻觉一样;

-Serializable 序列化执行
如何理解数据库事务?我的回答是:_第4张图片
所有事务依序执行,没有并发,当然就不存在其他的并发问题,但是效率较低,对数据库的性能消耗也较大,通常不建议使用;

Read uncommitted Read committed Repeatable read Serializable
脏读 V X X X
不可重复读 V V X X
幻读 V V V X

#传播行为
1、PROPAGATION_REQUIRED:如果当前没有事务,就创建一个新事务,如果当前存在事务,就加入该事务,该设置是最常用的设置。

2、PROPAGATION_SUPPORTS:支持当前事务,如果当前存在事务,就加入该事务,如果当前不存在事务,就以非事务执行。

3、PROPAGATION_MANDATORY:支持当前事务,如果当前存在事务,就加入该事务,如果当前不存在事务,就抛出异常。

4、PROPAGATION_REQUIRES_NEW:创建新事务,无论当前存不存在事务,都创建新事务。

5、PROPAGATION_NOT_SUPPORTED:以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。

6、PROPAGATION_NEVER:以非事务方式执行,如果当前存在事务,则抛出异常。

7、PROPAGATION_NESTED:如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则执行与PROPAGATION_REQUIRED类似的操作。

你可能感兴趣的:(逐本溯源)