mysql for update 锁_MySql FOR UPDATE 锁的一点问题……
問題描述
假設(shè)一個(gè)情況,這里只是假設(shè),真實(shí)的情況可能不會(huì)這樣設(shè)計(jì),但是假如真的發(fā)生了....鐵老大有一張這樣的ticket表,用來(lái)存放北京到上海的票。
iduidstart_addrend_addrbook_time
11300009860上海北京13866660321
20上海北京
30上海北京
40上海北京
uid?不等于0?并且?book_time?不等于0,則表示已售出,不許再更改。年底了,大家開始搶了,當(dāng)某一個(gè)人開始搶的時(shí)候,鐵老大這樣做了,當(dāng)A開始搶的時(shí)候,從表中所有uid=0的記錄中隨機(jī)取出一條,然后修改當(dāng)前記錄的uid為A的uid,book_time為當(dāng)前時(shí)間。那么好了,這個(gè)時(shí)候并發(fā)產(chǎn)生了,10000個(gè)人同時(shí)搶最后剩下的10張票,有2個(gè)人A,B同時(shí)讀取了uid=0?and?id=2的記錄,然后A把uid修改為自己的,book_time修改timeA,系統(tǒng)通知A搶票成功?緊接著,B同樣修改了這條記錄為自己的,那么這個(gè)時(shí)候A的票就失效了。這里就考慮使用鎖機(jī)制了,如果在A讀取了這條記錄后,并把這條記錄加上寫鎖,那么別人就無(wú)法再讀取加鎖,也就不會(huì)修改多次了。
實(shí)驗(yàn)結(jié)果
實(shí)驗(yàn)了一下for?update?加鎖,然后發(fā)現(xiàn)了一些問題。1、當(dāng)我們使用主鍵查詢?nèi)ゼ渔i的時(shí)候,可以對(duì)這條記錄加行鎖打開一個(gè)終端:執(zhí)行一下代碼:mysql> begin;
Query OK, 0 rows affected (0.00 sec)
mysql> select * from ticket where id = 2 for update;
那么?id=2這個(gè)記錄就會(huì)被加行寫鎖。令一個(gè)終端將無(wú)法讀取該記錄,但是卻可以讀取其他記錄#可以讀取加鎖
mysql> select * from ticket where id = 3 for update;
#不可以讀取
mysql> select * from ticket where id = 2 for update;
2、但是當(dāng)我們按非主鍵查詢會(huì)怎樣呢mysql> begin;
Query OK, 0 rows affected (0.00 sec)
mysql> select * from ticket where uid = 0 limit 1 for update;
那么這個(gè)時(shí)候,這個(gè)表會(huì)被鎖住,任何記錄都不能再讀取加鎖//不可讀取,等待釋放鎖
mysql> select * from ticket where id = 1 for update;
//不可讀取等待釋放鎖
mysql> select * from ticket where uid = 0 limit 1 for update;
但是表鎖會(huì)減少并發(fā)。
結(jié)論
有沒有一種方法,可以在非主鍵字段查詢一條記錄時(shí)上實(shí)現(xiàn)加行寫鎖,期待高手支招。
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來(lái)咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
以上是生活随笔為你收集整理的mysql for update 锁_MySql FOR UPDATE 锁的一点问题……的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 微软u盘安装工具_使用微软Winget工
- 下一篇: 如何彻底卸载MySQL