當要使用本表的數據更新本表時,容易出錯:
如下:
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子句中遇到子查詢時,先執行子查詢並將結果放到一個臨時表中,我們通常稱它爲“派生表”;臨時表是沒有索引、無法加鎖的。