事物的特性、传播特性及隔离级别
一、事物的传播特性:
二、事务的四大特性
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):一个事物在执行过程中完全看不到其他事物对数据库所做的更新,可避免脏读、不可重复读、幻读的发生。