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

Mysql高并發(fā)

老白2年前12瀏覽0評論

Mysql高并發(fā)?

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

不過,mysql默認的隔離級別是Repeatable read。會出現(xiàn)幻讀。如果是Read commited,會出現(xiàn)不可重復讀。

如下:

==============================================================

隔離級別 -------------- 臟讀 --- 不可重復讀 --- 幻讀

==============================================================

未提交讀(Read uncommitted) 可能 可能 可能

已提交讀(Read committed) 不可能 可能 可能

可重復讀(Repeatable read) 不可能 不可能 可能

可串行化(Serializable ) 不可能 不可能 不可能

==============================================================

什么是不可重復讀呢?

在一個事務中,第一次讀和第二次,有可能讀到的同一條數(shù)據不一致。

比如:

begin

select name from b where col=5;

比如結果為:xiaoli

update b set info='abc' where col=5 and name='xiaoli';

我們并沒有修改,col=5的name字段,但是再次讀這條數(shù)據的時候

select name from b where col=5;

這里結果,可能是'zhangsan'。

commit

為什么這樣呢?當你這個事務在執(zhí)行的過程中,其他事務提交了一個update,修改了col=5這條數(shù)據。

什么是幻讀呢?就是在一個事務中,已經對符合條件的數(shù)據進行了變更,但是提交前再次讀取的時候,還會有滿足要求的數(shù)據,因為在你的事務過程中,有其他的事務進行了新數(shù)據的提交,導致你又出現(xiàn)了滿足條件的數(shù)據。

比如:

begin

select count(*) from b where col=5;

比如一共三條

update b set col=10 where col=5;

提示已經更改了3行數(shù)據。

這時候已經修改但是沒有提交,

select count(*) from b where col=5;

發(fā)現(xiàn),又出現(xiàn)了一條。

commit

就會發(fā)現(xiàn)怎么還有一條沒有更新到呢?

這就是幻讀。

如果你非要解決這個問題的話,set global transaction isolation level serializable;

這種情況下,我在一個事務中執(zhí)行的時候,其他事務只能等待。哪怕我只執(zhí)行了一個select語句。

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

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