sql 同時(更新)update和(查詢)select同一張表

當要使用本表的數據更新本表時,容易出錯:

如下:

update b 
set aaa=select max(MAX_def_60M) as max from b

[Err] 1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'select max(MAX_def_60M) as max from b' at line 2

解決辦法:再嵌套一層查詢

update b 
set aaa=
(select max 
from 
(select max(MAX_def_60M) as max from b) as temp
)

不能同時讀寫的原因:mysql讀寫鎖鎖定的問題


若事務T對數據對象A加上S鎖,則事務T可以讀A但不能修改A,其他事務只能再對A加S鎖,而不能加X鎖,直到T釋放A上的S鎖。這保證了其他事務可以讀A,但在T釋放A上的S鎖之前不能對A做任何修改。

寫鎖:

若事務T對數據對象A加上X鎖,事務T可以讀A也可以修改A,其他事務不能再對A加任何鎖,直到T釋放A上的鎖。這保證了其他事務在T釋放A上的鎖之前不能再讀取和修改A。

加了共享鎖的對象,可以繼續加共享鎖,不能再加排它鎖。加了排它鎖後,不能再加任何鎖。

那麼說我在更新一個表的時候,我鎖定了一行,這一行我是不能加讀鎖的了,所以這時我查詢這張表,就會出現這種問題。


加一層子查詢之後成功的原因(待補充):

mysql在from子句中遇到子查詢時,先執行子查詢並將結果放到一個臨時表中,我們通常稱它爲“派生表”;臨時表是沒有索引、無法加鎖的。







發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章