首頁  >  問答  >  主體

mysql - 乐观锁与悲观锁各自适用场景是什么?

悲观锁貌似没法解决更新丢失的问题。见下面的例子,两个用户张三,李四,他们两人可以更新同一条数据库记录。假设记录为(sex,age) = (‘male’, 25)。在张三的查询和修改的时间间隔内,李四更新了记录,而张三对这种情况不知情,最后导致李四的更新丢失了。无论加不加悲观锁,都解决不了这种问题。我的问题是

1)对于这种并发写冲突,是不是只能用乐观锁(给表加一个版本号字段)来防止更新丢失?
2)那select ... for update这种悲观锁在什么场景下使用,悲观锁的使用应该是为了解决并发写冲突,但貌似它又不能解决更新丢失问题,感觉有点鸡肋啊,亦或是我理解有误.

有一篇相关文章,参见http://www.douban.com/note/204830640/

高洛峰高洛峰2743 天前810

全部回覆(1)我來回復

  • 阿神

    阿神2017-04-17 12:03:11

    張三和李四的例子中其實沒有加鎖。這是事務的問題。
    李四在張三還沒執行修改之前就把記錄給修改了,導致其修改被張三覆蓋,所以更新遺失。這個問題的根本原因是事務沒有進行隔離(可以搜尋一下事務的ACID分別是什麼)。張三的修改操作和李四的修改操作分為兩個不同的事務,事務之間應該具有隔離性(ACID中的I)。
    實現隔離性的方法是加鎖,又分為悲觀鎖和樂觀鎖。
    當張三想要修改記錄時,首先對這條記錄加鎖,這樣在張三持有鎖的期間,李四就修改不了這條數據了,張三修改完成後釋放鎖,李四再獲得這個鎖,然後修改記錄,釋放鎖。為什麼稱為悲觀鎖呢,主要是,每個想要修改記錄的人都「悲觀地」認為別人會來並發修改這條數據,所以要先加鎖。

    你這個問題是事務的問題,不是鎖的問題。

    回覆
    0
  • 取消回覆