1: 事务的特点: acid(原子性, 一致性, 隔离性, 持久性)
2: 多个事务同时执行导致的问题: 脏读, 不可重复读, 幻读
3: 为了解决2引入的问题, 出现了隔离级别
4: 隔离级别: 读未提交, 读提交, 可重复读, 串行化
读未提交: 就算没有提交, 其他事务也能看到其更改
读提交: 只有提交之后, 其他事务才能看到其更改
可重复读: 事务启动时看到的数据和事务提交之前整个过程看到的数据都是一样的
串行化: 对同一行记录, 读会加读锁, 写会加写锁, 读写锁冲突时, 会出现事务等待, 直到前一个事务完成才可以继续
5: 事务级别的实现: 每条记录在更新的时候都会记录一条回滚操作, 通过回滚操作可以得到前一个状态的值
不同时刻启动的事务会有不同的read-view
回滚日志删除时机: 系统会判断没有事务用到这些回滚日志时会进行删除
6: 尽量不要用长事务: 长事务会占用资源: 比如占用比较老的视图, 导致必须保留回滚记录, 导致占用大量存储空间
7: 事务的启动方式: 显示启动: start trancaction/begin 隐式启动: set autocommit = false:不会自动提交, 必须手动commit
8: 如何避免长事务?
从应用层看:
1: autocommit = 1
2: 确定是否有不必要的事务
3: 控制每条语句执行的最长时间:MAX_EXECUTION_TIME
从数据库看:
1: 监控 information_schema.Innodb_trx 表,设置长事务阈值,超过就报警 / 或者 kill
2: 业务功能测试阶段要求输出所有的 general_log