mysql - 乐观锁与悲观锁各自适用场景是什么?
高洛峰
高洛峰 2017-04-17 12:01:11
0
1
807

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

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

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

高洛峰
高洛峰

拥有18年软件开发和IT教学经验。曾任多家上市公司技术总监、架构师、项目经理、高级软件工程师等职务。 网络人气名人讲师,...

全部回覆(1)
阿神

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

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

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!