【MySQL】事务并发产生的问题

脏读

脏读:一个事务读取到了另外一个事务未提交的数据。(读脏数据)

破坏了事务的隔离性 隔离性:要求每个事务读写的操作对象对于其他事务的操作对象能够互相分离。即一个事务在进行过程中操作的对象(中间结果)对于另外的一个事务来说是不可见的(通常通过锁机制来实现); 隔离性是针对数据资源的并发访问,规定了各个事务之间相互影响的程度。

不可重复读

不可重复读(幻像,幻读):一个事务读到了另外一个事务已经提交的数据,导致两次读取到的内容不相同。(在逻辑上,应该是相同的,但此时不同)

实际上不可重复读和幻读是有区别的,强调的点是不同的 不可重复读:强调数据内容的更新,而不是结果集合的增减 幻读:两次连续的的查询,强调第二次查询到的内容行数变多 破坏了事务的一致性 一致性: 官方解释:一致性是指事务必须使数据库从一个一致性状态变换到另一个一致性状态,也就是说一个事务执行之前和执行之后都必须处于一致性状态。 别的博主对于一致性的解释:一致性是数据库处理前后结果应与其所抽象的客观世界中真实状况保持一致。这种一致性是一种需要管理员去定义的规则。管理员如何指定规则,数据库就严格按照这种规则去处理数据。(比较认同) 我的理解是:一个事务开始时与过程中或者结束后看到的数据库状态是在逻辑上一致且正确的。如果说事务开始时数据库的状态和当前数据库的状态是逻辑上是一致的,就是保持了事务的一致性。

不可重复读的问题,不算严重,因为读到的是已经提交到了的数据,因此许多数据库厂商将事务的默认隔离级别设置为READ COMMITTED

注意: 两者不同之处在于读到的另外的一个事务的数据是否提交,如果没有提交,就读到了,就是脏读,读到的是已经提交了的,就是不可重复读。

丢失更新

两种情况下会发生:

  1. 一个事务对一行的数据写操作覆盖了另外的事务对改行的更新
  2. 一个事务修改了一行记录,另一个事务也修改了这一行之后提交了,而第一个事务进行回滚操作,数据恢复到原始状态。
在任何一种隔离级别情况下都无会发生,因为任何操作都会加锁。
经验分享 程序员 微信小程序 职场和发展