一、什么是数据库事务
事务是应用程序中一系列逻辑相关的操作,所有操作必须成功完成,否则在每个操作中所作的所有更改都会被撤消。事务的结束有两种, 当事务中的所以步骤全部成功执行时,事务提交。如果其中一个步骤失败,将发生回滚操作,撤消之前的所有操作。
二、事务的 ACID
事务具有四个特征:原子性( Atomicity )、一致性( Consistency )、隔离性( Isolation )和持久性( Durability )。这四个特性简称为 ACID 特性。
- 原子性
事务的数据库逻辑工作单位,不可分割,事务中的操作要么都成功,要么都失败。 - 一致性
事务必须使数据库从一个一致性状态变换到另一个一致性状态,也就是说一个事务执行之前和执行之后都必须处于一致性状态。 - 隔离性
事务的执行不能其它事务干扰。即一个事务内部的操作及使用的数据对其它并发事务是隔离的,并发执行的各个事务之间不能互相干扰。 - 持久性
事务一旦提交,它对数据库中的数据的改变就应该是永久性的,不能回滚。接下来的其它操作或故障不应该对其执行结果有任何影响。
三、数据库事务的四种隔离级别
- Read uncommitted (读未提交)
最低级别,以上问题均无法解决。 - Read committed (读已提交)
读已提交,可避免脏读情况发生。 - Repeatable Read(可重复读)
确保事务可以多次从一个字段中读取相同的值,在此事务持续期间,禁止其他事务对此字段的更新,可以避免脏读和不可重复读,仍会出现幻读问题。 - Serializable(串行化)
最严格的事务隔离级别,要求所有事务被串行执行,不能并发执行,可避免脏读、不可重复读、幻读情况的发生。
四、数据库事务三种不隔离问题
脏读、不可重复读和幻读,其实都是数据库读一致性问题,必须由数据库提供一定的事务隔离机制来解决。
- 脏读
脏读是指一个事务处理中读到了另一个未提交的事务中的数据。 - 不可重复度
不可重复读是指在数据库中一个事物查询了多次返回了不同的数据值,由于查询间隔,被另外一个事物修改并提交了。 不可重复读和脏读的区别,脏读是某一个事务读取到了另外一个事务未提交的数据,不可重复读则是读取到了另外一个事务提交后的数据。 - 幻读
幻读是指一个事务在前后两次查询同一个范围的时候,后一次查询看到了前一次查询没有看到的行。 幻读和不可重复读都是读取了另一条已经提交的事务(这点就与脏读不同),所不同的是不可重复读查询的都是同一个数据项,而幻读针对的是一批数据整体
五、数据库事务的七种传播属性
- PROPAGATION_REQUIRED
支持当前事务,如果当前没有事务,就新建一个事务。这是最常见的选择 - PROPAGATION_SUPPORTS
支持当前事务,如果当前没有事务,就以非事务方式执行 - PROPAGATION_MANDATORY
支持当前事务,如果当前没有事务,就抛出异常 - PROPAGATION_REQUIRES_NEW
新建事务,如果当前存在事务,把当前事务挂起 - PROPAGATION_NOT_SUPPORTED
以非事务方式执行操作,如果当前存在事务,就把当前事务挂起 - PROPAGATION_NEVER
以非事务方式执行,如果当前存在事务,则抛出异常 - PROPAGATION_NESTED
如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则进行与PROPAGATION_REQUIRED类似的操作