事物的特性
原子性(atomicity)
一个事物是不可分割的工作单元,事务中的诸多操作要么都做,要么都不做
举例:用户a给用户b转账1000元
1:用户a账户扣除1000
2:用户b账户增加1000
如果其中任何一个人数据操作失败,则都失败,保持原来的数值
只有当两个账户操作都成功,才能算转账完成
一致性(consistency)
事物必须是使数据库从一个一致性状态变到另一个一致状态,一致性和原子性密切相关
举例:用户a给用户b转账1000元
1:用户a账户扣除1000
2:用户b账户增加1000
即用户a账户-1000,用户b账户+1000,两个账户数值相加为0
隔离性(isolation)
数据库默认事务隔离级别为:REPEATABLE READ
一个事务的执行不能被其他事务干扰,即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各种事务之间不能相互干扰
- 未提交度(READ UNCOMMITTED)(脏读)
事务A开启了事务并更新,在提交事务前,事务B读取了修改后的数据, 如果事务A回滚, 事务B读到的数据就是脏数据
- 已提交读(READ CPMMITTED)(不可重复读)
事物A开启事物并更新,提交事务前,事务B读取的数据是事务A更新前的数据
当事务A提交后,事务B读取的数据是事务A提交后的数据
- 可重复读(REPEATABLE READ)
事物A开启事物并更新,提交事务前,事务B读取的数据是事务A提交前的数据
当事务A提交后,事务B读取的数据也是事务A提交前的数据
- 可串行化(SERIALIZABLE)(幻读)
只有在数据增加和删除的情况下才会产生幻读的问题
事务A根据条件查询并修改数据后,提交事物前时发现还有其他新数据
此隔离级别解决幻读的问题,但是使用的事表锁,并发度低
持久性(durability)
也成为永久性(permanence),指一个事务一单提交,他对数据库中的数据改变是永久性的。接下来的其他操作和鼓掌不应该对其有任何影响
总结
隔离级别 | 脏读 | 不可重复读 | 幻读 |
---|---|---|---|
read uncommitted (未提交读)(脏读) | 是 | 是 | 是 |
read committed(已提交读)(不可重复读) | 否 | 是 | 是 |
repeatable read(可重复度) | 否 | 否 | 否(通过gap锁实现) |
serializable(串行化) | 否 | 否 | 否 |