你说的这个,描述过于简单,无法判断具体情况。
不过,mysql默认的隔离级别是Repeatable read。会出现幻读。如果是Read commited,会出现不可重复读。
如下:
==============================================================
隔离级别 ————– 脏读 — 不可重复读 — 幻读
==============================================================
未提交读(Read uncommitted) 可能 可能 可能
已提交读(Read committed) 不可能 可能 可能
可重复读(Repeatable read) 不可能 不可能 可能
可串行化(Serializable ) 不可能 不可能 不可能
==============================================================
什么是不可重复读呢?
在一个事务中,第一次读和第二次,有可能读到的同一条数据不一致。
比如:
begin
select name from b where col=5;
比如结果为:xiaoli
update b set info=’abc’ where col=5 and name=’xiaoli’;
大家并没有修改,col=5的name字段,但是再次读这条数据的时候
select name from b where col=5;
这里结果,可能是’zhangsan’。
commit
为什么这样呢?当你这个事务在执行的过程中,其他事务提交了一个update,修改了col=5这条数据。
什么是幻读呢?就是在一个事务中,已经对符合条件的数据进行了变更,但是提交前再次读取的时候,还会有满足要求的数据,因为在你的事务过程中,有其他的事务进行了新数据的提交,导致你又出现了满足条件的数据。
比如:
begin
select count(*) from b where col=5;
比如一共三条
update b set col=10 where col=5;
提示已经更改了3行数据。
这时候已经修改但是没有提交,
select count(*) from b where col=5;
发现,又出现了一条。
commit
就会发现怎么还有一条没有更新到呢?
这就是幻读。
如果你非要解决这个问题的话,set global transaction isolation level serializable;
这种情况下,偶在一个事务中执行的时候,其他事务只能等待。哪怕偶只执行了一个select语句。
但是这种级别,基本上谈不上高并发,也高并发不起来。因此一般生产只能在高并发和事务上做一个平衡。
不知道你说的是不是这个问题,这种问题需要程序去配合当前的事务级别。