数据库事务
事务特性(ACID)
- 原子性:事务不可分割,要么全部成功,要么全部失败。
- 一致性:表示数据状态不会变。
- 隔离性:事物之间需要隔离机制。
- 持久性:事务的提交必须永久保存数据库。
事务并发引起的问题
- 脏读:事务读到未提交的数据。
- 不可重复读:事务中两次读取到的数据被修改。
- 幻读:事务中两次读取到的之前不存在的数据。
事务隔离级别
- 读未提交
- 读已提交
Mysql实现方式:使用MVCC,在一个事务中每次查询(快照读)数据前都会生成一个ReadView表,记录的有当前所有活跃的事务,和当前最小和最大事务id+1。通过版本链直到读取的数据版本不在活跃事务中且小于最小活跃事务id。 - 可重复读:mysql中默认级别,部分解决了幻读。
Mysql实现方式:使用MVCC,在一个事务中仅第一次查询(快照读)数据前生成一个ReadView表,记录的有当前所有活跃的事务,和当前最小和最大事务id。通过版本链直到读取的数据版本不在活跃事务中且小于最小活跃事务id。
此时可以发现,mysql使用该级别可以解决大部分幻读问题。
但是如果一个事务在两次查询期间操作数据,可能会导致两次查询出现幻读情况。
- 可串行化
MVCC
版本链
数据库表每条修改记录都有事务id和指针,指向上一个版本undolog日志记录。