并发控制的目的是保证一个用户的工作不会对另一个用户的工作产生不合理的影响。
隔离级别SQL92标准规定了四种隔离级别,read uncommitted、read committed、repeatable read、serializable isolation。
下图是ANSI SQL标准规定的事务隔离级别和有害现象的关系。
ANSI标准规定了三种有害现象,脏读、不可重复读(模糊读)、幻读。并通过这三种有害现象区分出了不同的隔离级别。
- 脏读: 读到未提交事务修改的数据;
- 不可重复读:事务在执行过程中两次读取同一部分数据,得到的结果不一致。
- 幻读:事务在执行过程中,两次执行同一条件的查询语句,发现第二次读的数据比第一次要多。
不可重复读和幻读最大的区别就是不可重复读只需要锁住已经读过的数据就可以了,而幻读需要对还不存在的数据(或者是尚未满足条件的数据)做出预防。
4个事务隔离级别,不同的隔离级别对事务的处理不同,分别是:未授权读取,授权读取,可重复读取和串行化
该隔离级别允许脏读取,其隔离级别最低;比如事务A和事务B同时进行,事务A在整个执行阶段,会将某数据的值从1开始一直加到10,然后进行事务提交,此时,事务B能够看到这个数据项在事务A *** 作过程中的所有中间值(如1变成2,2变成3等),而对这一系列的中间值的读取就是读未提交。
已提交读(Read Commited)授权读取也称为已提交读(Read Commited),授权读取只允许获取已经提交的数据。比如事务A和事务B同时进行,事务A进行+1 *** 作,此时,事务B无法看到这个数据项在事务A *** 作过程中的所有中间值,只能看到最终的10。另外,如果说有一个事务C,和事务A进行非常类似的 *** 作,只是事务C是将数据项从10加到20,此时事务B也同样可以读取到20,即授权读取允许不可重复读取。
如果是一个读事务(线程),则允许其他事务读写,如果是写事务将会禁止其他事务访问该行数据,该隔离级别避免了脏读,但是可能出现不可重复读。事务A事先读取了数据,事务B紧接着更新了数据,并提交了事务,而事务A再次读取该数据时,数据已经发生了改变。
就是保证在事务处理过程中,多次读取同一个数据时,其值都和事务开始时刻是一致的,因此该事务级别禁止不可重复读取和脏读取,但是有可能出现幻影数据。所谓幻影数据,就是指同样的事务 *** 作,在前后两个时间段内执行对同一个数据项的读取,可能出现不一致的结果。在上面的例子中,可重复读取隔离级别能够保证事务B在第一次事务 *** 作过程中,始终对数据项读取到1,但是在下一次事务 *** 作中,即使事务B(注意,事务名字虽然相同,但是指的是另一个事务 *** 作)采用同样的查询方式,就可能读取到10或20;
可重复读取是指在一个事务内,多次读同一个数据,在这个事务还没结束时,其他事务不能访问该数据(包括了读写),这样就可以在同一个事务内两次读到的数据是一样的,因此称为是可重复读隔离级别,读取数据的事务将会禁止写事务(但允许读事务),写事务则禁止任何其他事务(包括了读写),这样避免了不可重复读和脏读,但是有时可能会出现幻读。(读取数据的事务)可以通过“共享读镜”和“排他写锁”实现。
是最严格的事务隔离级别,它要求所有事务被串行执行,即事务只能一个接一个的进行处理,不能并发执行。
串行化隔离级别如果仅仅通过“行级锁”是无法实现序列化的,必须通过其他机制保证新插入的数据不会被执行查询 *** 作的事务访问到。序列化是最高的事务隔离级别,同时代价也是最高的,性能很低,一般很少使用,在该级别下,事务顺序执行,不仅可以避免脏读、不可重复读,还避免了幻读。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)