提到事务,就会想到ACID(Atomicity、Consistency、Isolation、Durability,即原子性,一致性,隔离性,持久性)。
SQL标准的事务隔离级别包括:
读未提交:一个事务还没提交时,它做的变更就能被别的事务看到。
读提交:一个事务提交之后,它做的变更才会被其他事务看到。
可重复读:一个事务执行过程中,从事务开始到事务提交看到的数据是一致的。
串行化:对于同一条记录,串行访问,读写都会加锁。
Oracle默认隔离级别就是读提交,迁移到MySQL,需要修改隔离级别为读提交。将启动参数transaction-isolation值设置为READ-COMMITTED。
可重复读场景
对账功能中判断上个月的余额和本月余额的差额,是否与本月账单明细一致。在校对过程中,即使有用户交易,也不影响校对结果。
事务隔离实现
在MySQL中,实际上每条记录在更新的时候都会同时记录一条回滚操作。通过回滚操作,都可以得到前一个状态的值。同一条记录在系统中可以存在多个版本,就是数据库的多版本并发控制(MVCC)。
避免长事务:长事务意味着系统里会存在很老的事务视图,占用大量存储空间。
原文出处:https://time.geekbang.org/column/article/68963(极客时间专栏)