数据库事务级别
1、未提交读
故名思议 未提交就让别的事务读,容易产生脏读。 是限制级别最低的级别。
比如事务1修改了一行数据,事务2在事务1未提交之前读取了这行数据,如果事务1进行了回滚,那么事务2就读取了一行没有提交的数据,这样的数据是不存在的。所以产生了脏读。
2、提交读
默认的隔离级别,不能读取其他事务未提交的数据,禁止脏读。
比如事务1读取了一行数据,事务2修改了这行的数据并且提交了,如果事务1再去读取这行数据,发现于上次读取的数据不一致,也叫不可重复读。
3、可重复读
比提交读更强的限制级别。包括了提交读,指定当前事务未提交前,其他任何事务均不可修改当前事务的数据,并发低于提交读,因为已读取的数据共享锁在整个事务期间。
比如:事务1读取一行数据,事务2想修改这行数据并且提交,但事务1未提交,数据行中有事务1的锁,事务2无法进行 更新操作,因此事务2堵塞。如果事务1在想读取这行数据,它读取的结果和第一次一样,也叫可重复读。
4、serializable 级别
是限制性最强的级别,因为该级别锁定整个范围的键,并一直持有锁,直到事务完成。该级别包括repeatable read,
并增加了在事务完成之前,其他事务不能向事务已读取的范围插入新行的限制。比如事务1读取了一系列满足搜索条件
的行,事务2在执行sql 产生一行或者多行满足事务1搜索条件的行时会冲突,则事务2回滚。防止了幻读
重复读 保证一个事务中,相同的条件下读取的数据值不会发生改变,但不能保证下次同样的条件查询,结果记录数不变。
幻读:为了解决这个问题而存在,他将这个查询范围枷锁了 ,不可以从这个范围插入数据。
隔离级别于锁的关系
在Read Uncommitted级别下,读操作不加S锁;
在Read Committed级别下,读操作需要加S锁,但是在语句执行完以后释放S锁;
在Repeatable Read级别下,读操作需要加S锁,但是在事务提交之前并不释放S锁,也就是必须等待事务执行完毕以后才释放S锁。
在Serialize级别下,会在Repeatable Read级别的基础上,添加一个范围锁。保证一个事务内的两次查询结果完全一样,而不会出现第一次查询结果是第二次查询结果的子集
mysql 设置事务隔离级别
set (session | global) transaction isolation level {read uncommitted|
read committed | pepeatable read | serializable}