你說的這個,描述過于簡單,無法判斷具體情況。
不過,mysql默認的隔離級別是Repeatableread。會出現幻讀。如果是Readcommited,會出現不可重復讀。
如下:
==============================================================
隔離級別--------------臟讀---不可重復讀---幻讀
==============================================================
未提交讀(Readuncommitted)可能可能可能
已提交讀(Readcommitted)不可能可能可能
可重復讀(Repeatableread)不可能不可能可能
可串行化(Serializable)不可能不可能不可能
==============================================================
什么是不可重復讀呢?
在一個事務中,第一次讀和第二次,有可能讀到的同一條數據不一致。
比如:
begin
selectnamefrombwherecol=5;
比如結果為:xiaoli
updatebsetinfo='abc'wherecol=5andname='xiaoli';
我們并沒有修改,col=5的name字段,但是再次讀這條數據的時候
selectnamefrombwherecol=5;
這里結果,可能是'zhangsan'。
commit
為什么這樣呢?當你這個事務在執行的過程中,其他事務提交了一個update,修改了col=5這條數據。
什么是幻讀呢?就是在一個事務中,已經對符合條件的數據進行了變更,但是提交前再次讀取的時候,還會有滿足要求的數據,因為在你的事務過程中,有其他的事務進行了新數據的提交,導致你又出現了滿足條件的數據。
比如:
begin
selectcount(*)frombwherecol=5;
比如一共三條
updatebsetcol=10wherecol=5;
提示已經更改了3行數據。
這時候已經修改但是沒有提交,
selectcount(*)frombwherecol=5;
發現,又出現了一條。
commit
就會發現怎么還有一條沒有更新到呢?
這就是幻讀。
如果你非要解決這個問題的話,setglobaltransactionisolationlevelserializable;
這種情況下,我在一個事務中執行的時候,其他事務只能等待。哪怕我只執行了一個select語句。
但是這種級別,基本上談不上高并發,也高并發不起來。因此一般生產只能在高并發和事務上做一個平衡。
不知道你說的是不是這個問題,這種問題需要程序去配合當前的事務級別。