欧美一区二区三区,国内熟女精品熟女A片视频小说,日本av网,小鲜肉男男GAY做受XXX网站

Mysql高并發,數據亂竄?

錢浩然2年前15瀏覽0評論

你說的這個,描述過于簡單,無法判斷具體情況。

不過,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語句。

但是這種級別,基本上談不上高并發,也高并發不起來。因此一般生產只能在高并發和事務上做一個平衡。

不知道你說的是不是這個問題,這種問題需要程序去配合當前的事務級別。