隔离级别与丢失更新

Posted liushoudong

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了隔离级别与丢失更新相关的知识,希望对你有一定的参考价值。

原文链接:https://www.jianshu.com/p/592b2cdbc589

  • 第一类丢失更新
    撤销一个事务的时候,把其它事务已提交的更新数据覆盖了。这是完全没有事务隔离级别造成的。如果事务1被提交,另一个事务被撤销,那么会连同事务1所做的更新也被撤销。
  • 脏读(Dirty Read)
    如果一个事务对数据进行了更新,但事务还没有提交,另一个事务就可以“看到”该事务没有提交的更新结果。这样就造成的问题就是,如果第一个事务回滚,那么第二个事务在此之前所“看到”的数据就是一笔脏数据。
  • 不可重复读取(Non-Repeatable Read)
    不可重复读取是指同一个事务在整个事务过程中对同一笔数据进行读取,每次读取结果都不同。如果事务1在事务2的更新操作之前读取一次数据,在事务2的更新操作之后再读取同一笔数据一次,两次结果是不同的。所以Read Uncommitted也无法避免不可重复读取的问题。
  • 第二类丢失更新
    它和不可重复读本质上是同一类并发问题,通常将它看成不可重复读的特例。当两个或多个事务查询相同的记录,然后各自基于查询的结果更新记录时会造成第二类丢失更新问题。每个事务不知道其它事务的存在,最后一个事务对记录所做的更改将覆盖其它事务之前对该记录所做的更改。
  • 幻读(Phanton Read)
    幻读是指同样一个查询在整个事务过程中多次执行后,查询所得的结果集是不一样的。幻读针对的是多笔记录。在Read Uncommitted隔离级别下,不管事务2的插入操作是否提交,事务1在插入操作执行之前和之后执行相同的查询,取得的结果集是不同的,所以Read Uncommitted同样无法避免幻读。
    无事务隔离级别,则存在:第一类丢失更新、脏读、不可重复读、第二类丢失更新和幻读问题。
    Read Uncommitted存在:脏读、不可重复读、第二类丢失更新和幻读问题。
    Read committed存在:不可重复读、第二类丢失更新和幻读问题。
    Repeatable Read存在:幻读问题。
    Serializable 不存在问题。


作者:CS_Mervyn
链接:https://www.jianshu.com/p/592b2cdbc589
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

以上是关于隔离级别与丢失更新的主要内容,如果未能解决你的问题,请参考以下文章

可序列化隔离级别发生更新丢失?

丢失更新会发生在 PostgreSQL 的读提交隔离级别吗?

精通Java事务编程-弱隔离级别之防止更新丢失

数据库的事务隔离级别

二.事务的隔离级别

小白知识:事务+ACID+更新丢失+脏读+幻读+隔离级别+锁