一、事物的传播特性:
属性名称 | 值 | 描 述 |
---|---|---|
PROPAGATION_REQUIRED | required | 支持当前事务。有事务就加入这个事务;没有事务则创建新的事务,默认 |
PROPAGATION_SUPPORTS | supports | 支持当前事务。有事务就加入这个事务;没有事务就以非事务方式执行。 |
PROPAGATION_MANDATORY | mandatory | 支持当前事务。如果当前没有事务,就抛出异常。 |
PROPAGATION_REQUIRES_NEW | requires_new | 将创建新的事务,如果当前存在事务,把当前事务挂起。 |
PROPAGATION_NOT_SUPPORTED | not_supported | 不支持当前事务,总是以非事务状态执行。如果没有,就以非事务方式执行;如果有,就将当前事务挂起。 |
PROPAGATION_NEVER | never | 不支持当前事务,如果当前存在事务,则抛出异常。 |
PROPAGATION.NESTED | nested | 嵌套事务,底层将使用 Savepoint 形成嵌套事务。 如果没有,就新建一个事务;如果有,就在当前事务中嵌套其他事务。 |
二、事务的四大特性
1.原子性(Atomicity):
事务中所有操作是不可分割的原子单位。事务中所有操作要么全部执行成功,要么全部执行失败。
2.一致性(Consistency):
事务执行后,数据库状态与其它业务规则保持一致。如转正业务,无论事务执行成功与否,参与转账的两个账号余额之和应该是不变的。
3.隔离性(Isolation):
隔离性是指在并发操作中,不同事务之间应该隔离开来,使每个并发中的事务不会相互干扰。
4.持久性(Durability):
一旦事务提交成功,事务中所有的数据操作都必须被持久化到数据库中,即使提交事务后,数据库马上崩溃,在数据库重启时,也必须你能保证通过某种机制恢复数据。
三、并发事务引起的问题
脏读(Dirty reads):
脏读发生在一个事务读取了另一个事务改写但尚未提交的数据时。如果改写在稍后被回滚了,那么第一个事务获取的数据就是无效的。
不可重复读(Nonrepeatable read)
不可重复读发生在一个事务执行相同的查询两次或两次以上,但是每次都得到不同的数据时。这通常是因为另一个并发事务在两次查询期间进行了更新。
幻读(Phantom read)
幻读与不可重复读类似。它发生在一个事务(T1)读取了几行数据,接着另一个并发事务(T2)插入了一些数据时。在随后的查询中,第一个事务(T1)就会发现多了一些原本不存在的记录。
注:
- 不可重复读的重点是修改:同样的条件, 你读取过的数据, 再次读取出来发现值不一样了
- 幻读的重点在于新增或者删除:同样的条件, 第1次和第2次读出来的记录数不一样 。
四、事务的隔离级别
Spring的事物本质其实就是数据库对事物的支持,没有数据库的事务支持,Spring是无法提供事务功能的,真正的数据库层的事务提交和回滚是通过binlog实现的,隔离级别有四种:
读未提交(read uncommitted):一个事务还没提交时,它做的变更就能被别的事务看到,最低级别,任何情况都不能保证。
读已提交(read committed):一个事务提交以后,它做的变更才会被其它事务看到,而且能看到该事务对已有记录的更新,可以避免脏读的发生。
可重复读(repeatable read):保证事务修改后的数据提交后才能被另一事务读取,,但是不能看到该事物对已有记录的更新,可避免脏读、不可重复读的的发生。Mysql innerDB 默认隔离级别。
串行化(serializable):一个事物在执行过程中完全看不到其他事物对数据库所做的更新,可避免脏读、不可重复读、幻读的发生。