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ā)和事務上做一個平衡。
不知道你說的是不是這個問題,這種問題需要程序去配合當前的事務級別。