多个事务并发执行的时候,可能会同时对缓存页里的一行数据进行更新,这个冲突怎么处理? 是否要加锁?
可能有的事务在对一行数据做更新,有的事务在查询这行数据,这里的冲突怎么处理?
这里实际上会涉及到脏写、脏读、不可重复读、幻读,四种问题。

就是解决多个事务并发运行的时候,同时写和同时读写的一些并发冲突的处理机制,包括了MySQL事务的隔离级别、MVCC多版本隔离、锁机制,等等。

脏写 脏读

脏写
事务B去修改了事务A修改过的值,但是此时事务A还没提交,所以事务A随时会回滚,导致事务B修改的值也没
脏读
事务B去查询了事务A修改过的数据,但是此时事务A还没提交,所以事务A随时会回滚导致事务B再次查询就读不到刚才事务A修改的数据了
总结
无论是脏写还是脏读,都是因为一个事务去更新或者查询了另外一个还没提交的事务更新过的数据。
因为另外一个事务还没提交,所以他随时可能会反悔会回滚,那么必然导致你更新的数据就没了,或者你之前查询到的数据就没了,这就是脏写和脏读两种坑爹场景

幻读

事务A可以读到事务B修改过还没提交的数据,此时事务B一旦回滚,事务A再次读就读不到了

不可重复读

在事务A执行过程中,事务B和事务C修改了数据,事务A多次读取到的结果都不一样

事务隔离级别

read uncommitted(读未提交)是不允许发生脏写的 ,可能发生脏读 不可重复读 幻读
read committed(读已提交) 不会发生脏写和脏读, 可能会发生不可重复读和幻读 简称RC
repeatable read(可重复读) 不会发生脏写、脏读和不可重复读的问题 简称RR
serializable(串行化)