事务的特点:同一个事务里 全部成功或者全部失败
ACID (原子性,一致性,隔离性(Isolation),持久性)
隔离性中的隔离级别:
读未提交 读已提交( Oracle默认) 可重复读(Mysql默认) 串行化
两个事务的流程图
![](https://img.haomeiwen.com/i7912723/09cfcd468d1cbeae.png)
读未提交:V1 V2 V3 为2
读已提交:V1 =1 V2 = 2 V3 = 2
可重复读:V1 = 1 V2 = 1 (同一个事务内的一致性) V3 = 2
串行化:会通过加读写的方式保证一致性,读写锁冲突,则必须等前一个锁被解除才能执行。
V1 = 1 V2 = 1 (这个时候读写锁冲突) V3 = 2
哪个隔离级别更好?
存在即合理,依照业务场景划分。
什么是回滚?(不纠结)
每一次数据更新的时候 但 没有提交之前 都会有记录 一条回滚记录(read-view)。
多条回滚记录形成一条回滚日志
回滚日志不会一直保留,当系统没有比这个回滚日志更早的read-view时删除
长事务会在这个事务提交之前,一直保留回滚记录,造成压力。
长事务的查询:
select * from information_schema.innodb_trx where TIME_TO_SEC(timediff(now(),trx_started))>60
长事务的避免:
begin 或者 start transaction 开启显式事务 后
有些客户端的连接框架会模式连接成功后执行 set autocommit=0 (取消自动提交) 导致之后的查询,假如说是长连接,那么就会是意外的长事务。
在设置autocommit =1 (设置为自动提交) 的情况下 会使用显式语句的方式启动事务
执行commit 则提交事务
执行commit and check 则提交事务后同时自动开启下一个显式事务(???)
网友评论