第一级别:read-uncommitted:
第二级别:read-committed:
第三级别:repeatable-read(可重复读):
repeateable-read级别只限制了增删改,并没有限制查询操作。
第四级别:serializable(串行化):
一开始不会阻塞查询(多个事务可以同时进行查询)。当其中一个事务要执行增删改就会触发可串行化,触发后会对增删改查都串行化,一旦串行化就是,事务之间的操作就会出现事务阻塞。
这里的事务阻塞之间的一些增删改查操作是由时间限制的,超过一定时间就会报错,来重启事务。
举个例子:
在第四级别中,有两个a,b事务,两个事务之间进行查询操作是不会变化的!查询操作是不会被事务阻塞的!
但是,如果其中有一个事务进行了增删改的操作,例如:事务a进行了update操作。就会触发串行化的机制。
这样事务a的update操作就会被卡住,要等到事务b提交事务后,事务a才能继续执行。如果期间事务b又进行了update的操作,因为串行化后会有表级锁,锁住!因此不能执行其他增删改操作,就会报错!
如果事务b进行了提交,那么事务a的update就会进行操作了。但是因为串行化已经被触发,之后执行查询操作也会被事务阻塞!
上面的过程多处涉及到锁的内容!
锁的分类:
一般可以分为两类,一个是悲观锁,一个是乐观锁,悲观锁一般就是我们通常说的数据库锁机制,乐观锁一般是指用户自己实现的一种锁机制。
悲观锁:它对于数据被外界修改持保守态度,认为数据随时会修改,所以整个数据处理中需要将数据加锁。悲观锁一般都是依靠关系数据库提供的锁机制,事实上关系数据库中的行锁,表锁不论是读写锁都是悲观锁。
乐观锁:顾名思义,就是很乐观,每次自己操作数据的时候认为没有人回来修改它,所以不去加锁,但是在更新的时候会去判断在此期间数据有没有被修改。
悲观锁按照使用性质划分:
共享锁(Share locks简记为S锁):也称读锁,事务A对对象obj加共享锁,其他事务也只能对obj加共享锁,多个事务可以同时读,但不能有写操作,直到A释放共享锁。
排它锁(Exclusivelocks简记为X锁):也称写锁,事务A对对象obj加排它锁以后,其他事务不能对obj加任何锁,只有事务A可以读写对象obj直到A释放排它锁。
更新锁(简记为U锁):用来预定要对此对象施加排它锁,它允许其他事务读,但不允许再施加更新锁或排它锁;当被读取的对象将要被更新时,则升级为排它锁,主要是用来防止死锁的。
悲观锁按照作用范围划分:
行锁:锁的作用范围是行级别,数据库能够确定那些行需要锁的情况下使用行锁,如果不知道会影响哪些行的时候就会使用表锁。
表锁:锁的作用范围是整张表。
还有一个页锁,不常用。
为了权衡『隔离』和『并发』的矛盾,ISO定义了四个事务的隔离级别,每个级别的隔离程度不同,允许出现的副作用也不同
我们说这个mysql的前提是使用的InnoDB类型mysql数据库:
锁机制:阻止其他事务对数据,各个隔离级别主要体现在读取数据时加的锁和释放时机
我们可以自己创建两个cmd窗口命令,set autocommit = 0;关闭自动提交,使用start transaction或直接启动一个select语句都可以开启一个事务。
这样我们就可以模拟一下上面的流程效果了。
每次测试前,我们都可以进行一个commit;事务提交。
以下是通过sql命令常用的命令:
-- 修改级别的mysql语句: set session transaction isolation level Repeatable Read;