事务的四大特性
- 原子性(Atomicity):事务是数据库的逻辑工作单位,包含的各种操作要么都做,要么都不做。
- 一致性(Consistency):事务执行的结果必须是使数据库从一个一致性状态变到另一个一致性状态,即数据库中只包含成功事务提交的结果。
- 隔离性(Isolation):并发执行的各个事务之间不会互相干扰。
- 持久性(Durability):一个事务一旦提交,它对数据库中的数据的改变应该是永久的。
脏读、不可重复读、幻读
- 脏读
解释:读到了未提交事务的数据
解决:升级事务隔离级别,如”读已提交” - 不可重复读
解释: 事务 A 先读取一条数据,然后执行逻辑的过程中,事务 B 更新了这条数据,事务 A 再读取时,发现数据不匹配,这个现象就是“不可重复读”。
解决:升级事务隔离级别 - 幻读
解释:在一个事务内,同一条查询语句在不同时间段执行,得到不同的结果集。
解决:间隙锁 MVCC多版本并发控制
事务的隔离级别
- Read Uncommitted(读并提交)
所有事务都可以看到其他未提交事务的执行结果,会产生脏读(读取未提交的数据) - Read committed(读提交)
一个事务只能看见已经提交事务所做的改变,会产生不可重复读问题 - Repeatable Read(可重读)
这是mysql默认事务隔离级别,可确保同一事务的多个实例在并发读取数据时,会看到同样的数据行。理论上,会导致一个棘手问题:幻读 - Serializable(串行化)
意味着读取数据时,需要获取共享读锁;更新数据时,需要获取排他写锁;如果 SQL 使用 WHERE 语句,还会获取区间锁。换句话说,事务 A 操作数据库