不过,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语句。
但是这种级别,基本上谈不上高并发,也高并发不起来。因此一般生产只能在高并发和事务上做一个平衡。
不知道你说的是不是这个问题,这种问题需要程序去配合当前的事务级别。