多个事务并发更新查询

脏写、脏读、不可重复读和幻读

  • 脏写:事务A写入一个值,然后事务B改变了事务A写入的值,过段时间事务A回滚了,事务B的修改丢失了
  • 脏读:事务A写入一个值,事务B读取事务A的值,后来发现值后来被事务A回滚了
  • 不可重复读:事务A读取了一个值,事务B此时更改了值并提交了事务,事务A再次查询,发现值变成了事务B更新的值
  • 幻读:一个事务用一样的SQL多次查询,每次查询都会查到一些之前没有看到过的数据

SQL层面的事务隔离级别

  • 读未提交:不可能两个事务在没提交的情况下更新同一行的数据值,及不允许发生脏写,但是在这种情况下会发生脏读、不可重复读、幻读
  • 读已提交:不会发生脏写、脏读,可能会发生不可重复读和幻读,因为其他事务一旦修改了值提交了事务,你的事务就会读到,所有可能多次读到的值是不同的
  • 可重复读:不会发生脏写、脏读、不可重复读,因为你一个事务多次查询一个值,哪怕别的事务提交了这个事,但是不会读到其它事务提交的值,你的事务一旦开始,多次查询一个值,会读取到同一个值
  • 串行化:不允许多个事务并行执行,只能串行执行

MVCC多版本并发控制机制

ReadView:执行一个事务的时候,会生成一个ReadView的视图,里面比较关键的东西有四个

  1. m_ids,此时有哪些事务在mysql执行还没用提交的
  2. min_trx_id,m_ids的最小值
  3. max_trx_id,mysql下一个要生成事务的id,即最大事务id
  4. create_trx_id,就是你这个事务的id