脏写和脏读都是在多个事务同时修改或读取同一行数据的情况下产生的问题。比如现在有事务1和事务2同时对一行数据进行修改,事务1将值改成1,而事务2将值改成了2,这时的值应该是2,但是就在这时,事务1发生了回滚,通过undo log,事务1将值回滚到原来的值0,而此时事务2一看我更新的2怎么突然变成0了,这就是脏写。




mysql数据库脏数据是什么 mysql脏读_回滚


所谓脏写,就是刚才明明写了一个数据值,结果过了一会儿却没了,本质就是事务2去修改了事务1修改过的值,但是此时事务1还没提交,所以事务1随时会回滚,导致事务2修改的值也没了。

脏读和脏写差不多,比如现在有两个事务1和事务2,事务1修改值为1,就在这时事务2来读取到1这个值,然后做一推业务处理,但是事务1此时发生回滚了将值回滚成0,这个是事务2又来读取这个值,发现变成了0,和之前读的1完全不同,这就是所谓的脏读。


mysql数据库脏数据是什么 mysql脏读_数据_02


如果事务2在事务1提交之前,是读不到事务1修改的值,必须要等事务1提交之后,才能读到事务1修改的值也就是1,那么这就解决了脏读的问题,但是这又会带来一个问题:不可重复读,假设事务1现在开启事务,第一次读取到的数据就是0,此时事务2将值修改为2,并提交事务,这时事务1第二次读取到值2,此时事务3将值改成3,并提交事务,那么事务1再次读取到的值是3,这就是不可重复读的问题。


mysql数据库脏数据是什么 mysql脏读_mysql数据库脏数据是什么_03


其实幻读也很简单,比如事务1执行一条sql,"select * from user where id>5",结果出现了2条数据,此时事务2新插入2条数据,并且提交事务,此时事务1又执行了"select * from user where id>5",结果出现了四条数据,此时事务3也插入了两条数据,并提交了事务,事务1又执行了"select * from user where id>5",结果出现了六条数据。每次执行相同的sql,结果的数量是不一样的,这就是幻读。


mysql数据库脏数据是什么 mysql脏读_数据_04