在MYSQL中,当很多事务同时进行时,会出现同一个表中的行或者列被多个事务同时读取或者修改的情况,那么此时就会出现语句执行优先级的问题。
例如:
脏读:在某个事物所做的修改尚未提交时,其他事务就能看见这个修改,并且其他事务认为此修改已经被执行,起作用了,即使进行修改的事务后面被回滚了,没有执行此操作,其他事务还是会这样认为。
不可重复读:同一事务多次使用select语句读取时,得到的结果不一样。例如一个事务两次用select读取,另外一个事务在他读取的过程中,对行进行了修改,那么这两个select将会得到不一样的结果。
幻影行:当一个事务对一个表进行select读取,之后另外一个事务对这个表插入新的行,再次在这个事务进行读取,则会看到这个新行,其实是一个幻影。
为解决上述的问题,MYSQL的InnoDB引擎提供了四个等级的事务隔离等级,对事务进行等级划分,规定哪些事务可以看到其他事务所做的修改。
事务隔离级别:
READ UNCOMMITTED:允许其他事务看到尚未提交的行修改
READ CIMMITTED:允许某个事务看到已经提交的行修改
REPEATABLE READ:当一个事务执行两个相同的语句时,看到的结果是重复的,即使有事务同时修改行,看到的结果也是一样的(系统默认)
SERIALIZABE:当某个事务在读取某一行时,只有等他结束之后才能进行修改。
要修改这些事务隔离等级,方法如下:(三种)
set global transaction isolation level LEVEL;
set session transaction isolation level LEVEL;
set transaction isolation level LEVEL;