多个事务同时执行

  1. 多个事务并发执行的时候,可能会同时对缓存页里的一些数据进行更新,可能会产生冲突
  2. 有的事务在对一行数据做更新,有的事务在查询这行数据。可能会产生冲突。

    多事务并发更新,产生脏写和脏读,不可重复读,幻读

  3. 脏写:两个事务,事务A和事务B同时在更新一条数据,事务A更新为A值,事务B更新B值。事务A更新的时候会记录一条redo_log日志和一条undo_log日志,undo_log日志记录这条数据的原始值为NULL,如果事务A回滚,将值从A更新为NULL. 事务B看到的场景就是自己更新的值没了,这就是脏写。脏写是两个事务都未提交的情况下修改数据值。

  4. 脏读:事务A更新了一行数据值为A,此时事务B查询了这行数据值,看到的A。事务A回滚,事务B再次查询那行数据值,看到的是NULL。这就是脏读,读到了别的事务还未提交前修改的值。
  5. 不可重复读:原有数据为A值,事务A开启后,第一次查询这条数据,读取到的就是A,接着事务B更新了那行数据的值为B值,B提交事务,A还没提交事务,在事务期间第二次查询,查询到的值为B。事务C再次更新数据为C值,提交事务,事务A再次查询数据为C。此时数据A就是不可重复读的。
  6. 幻读:事务A第一次查询,查询出10条记录。此时事务B往表里插入了几条数据,事务B提交。 事务A再次查询相同的语句的结果比第一次多了几条数据。幻读就是查询到了之前查询未看到过的数据。
  7. 脏写,脏读,不可重复读,幻读都是数据库的多事务并发问题。为了解决并发问题,数据库设计了隔离机制,MVCC多版本隔离机制,锁机制来解决多事务并发。

    SQL的4个隔离机制

  8. read uncommitted(读未提交): 不可能两个事务在未提交的情况下去更新同一行数据的值。 不会发生脏写,但会发生脏读,不可重复读,幻读。

  9. read committed(读已提交):不会读到事务未提交情况下修改的值。不会出现脏写和脏读,但会发生不可重复读,幻读。
  10. REPEATABLE READ(可重复读):一个事务一旦开始,会一直读到同一个值,不管这个值是否被修改。不会发生脏写和脏读,不可重复读,但是可能会发生幻读。
  11. serializable(串行化) :不允许多个事务并发执行。