事务
1、什么是事务
在数据库中,所谓事务是指一组逻辑操作单元,使数据从一种状态变换到另一种状态。
为确保数据库中数据的一致性,数据的操纵应当是离散的成组的逻辑单元:
当它全部完成时,数据的一致性可以保持,
而当这个单元中的一部分操作失败,整个事务应全部视为错误,所有从起始点以后的操作应全部回退到开始状态
2、事务的ACID(acid)属性
- 原子性(Atomicity)原子性是指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。
- 一致性(Consistency)事务必须使数据库从一个一致性状态变换到另外一个一致性状态。
- 隔离性(Isolation)事务的隔离性是指一个事务的执行不能被其他事务干扰,即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰。
- 持久性(Durability)持久性是指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来的其他操作和数据库故障不应该对其有任何影响
3、并发可能产生的问题
- 脏读:
一个事务读取另外一个事务尚未提交的数据 - 不可重复读:
其他事务的操作导致某个事务两次读取数据不一致不可重复读,针对已经提交的数据。2.两次或多次读取同一条数据
- 幻读:
其他事务的数据操作导致某个事务两次读取数据数量不一致。例如:
对于两个事物 T1, T2, T1 从一个表中读取了一个字段, 然后 T2 在该表中插入了一些新的行. 之后, 如果 T1 再次读取同一个表, 就会多出几行.幻读针对已经提交的数据。2.两次或多次读取不同行数据,数量上新增或减少
4、事务的隔离级别
隔离级别 | 描述说明 |
---|---|
none | 无事务 |
READ_UNCOMMITTED(读未提交数据) | 脏读、不可重复读、幻读,3种情况都可能会发生 |
READ_COMMITTED(读已提交) | 只允许读取已提交的数据,既不可能发生脏读,有可能发生不可重复读和幻读 |
REPEATABLE_READ(可重复读) | 确保事务可以多次从一个字段读取相同的值,在这个事务持续期间,禁止其他事务对这个字段的更新。所以可以避免脏读和不可重复读,但幻读还是可能发生 |
SERIALIZABLE(直译为串行事务) | 保证不读脏,可重复读,不可幻读,事务隔离级别最高 |
慢慢更新