数据库事务
四大特性
原子性 隔离性 持久性 一致性
原子性
一个事务的多个数据库操作是一个不可分割的原子单元,只有所有的操作执行成功,整个事务才提交。
一致性
事务操作成功后,数据库所处的状态和他的业务规则是一致的,即数据不会被破坏。如A账户转账100元到B账户,不管操作成功与否,A和B账户的存款总额是不变的。
隔离性
事务之间有一定的隔离级别,保障不同程度的数据一致性。
持久性
一旦事务提交成功后,事务中所有的数据都被持久化到数据库中。
隔离带来的问题及对应的解决级别
-
丢失更新
第一类
第二类
最低的隔离级别Read uncommited即可防止此问题,这里的设置余额账户都是通过 monney = money - 100。这样才能解决,如果是读取到应用内存中,然后再通过复杂地计算得到一个新值,然后 update = newValue,这样子在此隔离级别下不能保证不丢失更新。这样子的问题要使用乐观锁或悲观锁。
- 脏读
脏读的解决方案:设置隔离级别为读已提交。
- 不可重复读
不可重复读的解决方案:设置隔离级别为可重复读。
- 幻读
幻读的解决方案:序列化。它要求事务序列化执行,事务只能一个接着一个地执行,但不能并发执行。