目录与学习目标

  1. 1:事务特点
  2. 2:隔离级别对多个事务影响
  3. 3:什么是事务回滚?
  4. 4:长事务与事务的开启关闭?

1:事务特点

  1. 事务的特点:同一个事务里 全部成功或者全部失败
  2. ACID (原子性,一致性,隔离性(Isolation),持久性)
  3. 隔离性中的隔离级别:
  4. 读未提交 读已提交( Oracle默认) 可重复读(Mysql默认) 串行化

2:隔离级别对多个事务影响

  1. 两个事务的流程图

image.png

  1. 读未提交:V1 V2 V3 2
  2. 读已提交:V1 =1 V2 = 2 V3 = 2
  3. 可重复读:V1 = 1 V2 = 1 (同一个事务内的一致性) V3 = 2
  4. 串行化:会通过对受影响的行加 读写锁的方式保证一致性,读写锁冲突,则必须等前一个锁被解除才能执行。
  5. V1 = 1 V2 = 1 (这个时候读写锁冲突) V3 = 2
  6. 读未提交:一个事务还没提交时,它做的变更就能被别的事务看到。
  7. 读已提交:一个事务提交之后,它做的变更才会被其他事务看到。(通过可重复读中 给该数据 加读写锁 解决)
  8. 可重复读:一个事务执行过程中看到的数据,总是跟这个事务在启动时看到的数据是一致的。
  9. 串行化:顾名思义是对于同一行记录,只要影响了该行数据 (如select * from table_name where id >0
  10. “读”会加“读锁”,“写”会加“写锁”。当出现读写锁冲突的时候,后访问的事务必须等前一个事务执行完成,才能继续执行。

  1. 哪个隔离级别更好?
  2. 存在即合理,依照业务场景划分。

3:什么是事务回滚?

  1. 每一次数据更新的时候 没有提交之前 都会有记录 一条回滚记录(read-view)。
  2. 多条回滚记录形成一条回滚日志
  3. 回滚日志不会一直保留,当系统没有比这个回滚日志更早的read-view时删除
  4. 当事务处可重复读(Mysql默认级别)(由于读写锁 本行数据不会受其他事务影响)
  5. 在视图 ABC 里面,这一个记录的值分别是 124
  6. 同一条记录在系统中可以存在多个版本,就是数据库的多版本并发控制(MVCC
  7. 之后会依据

image.png

4:长事务与事务的开启关闭?

  1. 长事务会在这个事务提交之前,一直保留回滚记录,造成压力。
  2. 长事务的查询:
  3. select * from information_schema.innodb_trx where TIME_TO_SEC(timediff(now(),trx_started))>60
  4. 显示的事务开启:
  5. begin 或者 start transaction 开启显式事务
  6. 配套的提交语句是 commit,回滚语句是 rollback
  7. 不管set autocommit=1 还是 0
  8. 1:使用begin 用显式语句的方式启动事务,并且事务都需要执行commit才能提交
  9. 2commit work and chain (提交并且开启了一个新的显示事务)(省略一次begin
  10. 有些客户端的连接框架会模式连接成功 默认后执行 set autocommit=0 (取消自动提交) 导致之后的查询,假如说是长连接,那么就会是意外的长事务。
  11. 解决方案:
  12. 不开启显式事务 同时设置autocommit =1 (设置为自动提交)