- 事务隔离
- MySQL是支持多引擎的系统,不是所有引擎都支持事务,比如MyISAM就不支持,这也是MyISAM被取代的原因之一
- 事务的ACID特性
- 原子性
- 一致性
- 隔离性
- 对于隔离性来说,隔离性越好效率越差
- 持久性
- 事务的标准隔离级别
- 读未提交
- 一个事务未提交,所做的变更能被别的事务看到
- 读已提交
- 一个事务提交之后,所做的变更才能被其它事务看到
- 可重复读
- 一个事务执行过程中,所读的数据总是跟这个事务在启动时看到的数据是一致的
- 串行化
- 对同一行记录,写会加写锁,读会加读锁,当出现读写锁冲突时,后访问的事务必须等前一个事务执行完毕
- 如何设置事务级别?
- 设置启动参数transaction-isolation
- 每个隔离级别都有适用的场景
- 比如可重复读,银行在校对差额时,将本月余额与账单明细进行校对,此时如果发生一笔新的交易则不受影响
- 读未提交
- 事务隔离的实现
- MySQL在每条记录更新时会同时记录一条回滚操作,通过回滚操作可以得到前一个状态的值,比如值1经过2 3 4 的顺序修改,那么回滚日志有对应的三条修改记录(read—view),在查询该记录时,不同时刻启动的的事务有不同的read—view,同一条记录在系统中可以存在不同的版本号,这就是数据库的多版本并发控制(MVCC)
- 回滚日志会在事务不需要的时候删除,即系统没有比当前回滚日志更早的read-view
- 为什么不建议使用长事务,长事务会保存很老的事务视图,事务提交之间回滚记录都需要保留,由于其它事务可能访问数据库里的任何数据,另一个影响是,长事务会占用锁资源,可能会拖垮整个数据库
- 事务启动方式
- 显示启动
- set autocommit 关闭自动提交(长事务)
- tip:通过显示语句启动事务并自动提交,set autocommit=1
- 长事务查询,表information_schema 用于查询持续时间超过60s的事务
- MySQL在每条记录更新时会同时记录一条回滚操作,通过回滚操作可以得到前一个状态的值,比如值1经过2 3 4 的顺序修改,那么回滚日志有对应的三条修改记录(read—view),在查询该记录时,不同时刻启动的的事务有不同的read—view,同一条记录在系统中可以存在不同的版本号,这就是数据库的多版本并发控制(MVCC)
MySQL事务隔离
最新推荐文章于 2025-05-14 09:22:11 发布