事务
分类
- 原子性 Atomicity
- 一致性 Consistency
- 隔离性 Isolation
- 持久性 Durability
隔离性
隔离别
- 读未提交 read uncommitted
一个事务还未提交,他所做的变更就可以被别的事务看到。 - 读提交 read committed
一个事务提交以后,他所做的变更就可以被别的事务看到 - 可重复读 repeatable read
一个事务执行过程中看到的数据是一致的。未提交的更改对其它事务不可见。 - 串行化 serializable
对应一个记录会加读写锁,出现冲突的时候,后访问的事务必须等前一个事务执行完才能继续执行。
配置方法
- show variables like ‘transaction_isolation’,查看当前隔离级别
- set transaction_isolation=‘xxx’, 设置隔离级别。
事务隔离的实现
MVCC 多版本并发控制
每条记录在更新的时候,都会同时记录一条回滚操作。同一条记录在系统中可以存在多个版本。这就是mvcc。
回滚日志
系统自动判断当没有事务需要用到这些回滚日志时,就会删除。
当最老的视图read-view都没有用到这些回滚日志时,就删除。
避免长事务
- 长事务里会存在很老的视图,占用大量的空间。
- 长事务可能占用锁资源,拖垮整个库。
事务启动方式
- 设置自动提交 set autocommit=1
- begin / start transaction 开始 commit / rollback结束
- commit work and chain 结束并开始。
监控长事务
information_schema.innodb_trx表里有长事务的记录,通过监控此表,及时发现长事务。
select * from information_schema.innodb_trx where TIME_TO_SEC(timediff(now(), trx_started))>60;
应用开发端
- 确认是否使用了set autocommit=0, 将其改为1.通过general_log日志来确认。
- 只读事务可以不放到begin/commit中
- 通过set max_execution_time来控制每个语句的最长执行时间。
数据库端
- 监控information_schema.innodb_trx,设置长事务阙值,超过就报警,或者kill
- Percona 的pt-kill工具。
- 在业务功能测试阶段,要求输出所有的general_log,分析日志行为,提前发现问题。
- MySQL5.6之后,把innodb_undo_tablespaces设置成2.