数据库隔离级别以及悲观锁和乐观锁

数据库隔离级别

目的:保证事务并发读取数据的正确性

数据库事务隔离级别

(1)Read uncommitted(读未提交数据):允许事务读取未被其他事务提交的变更数据,会出现脏读、不可重复读和虚读。

(2)Read committed(读已提交数据):只允许事务读取已经被其他事务提交的变更数据,可避免脏读,仍会有不可重复读和虚读

(3)Repeatable read(可重复读):确保事务可以多次从一个字段中读取相同的值,在此事务持续期间,禁止其他事务对此字段的更新,可避免脏读、不可重复读仍会有虚读。

(4)Serializable(序列化):确保事务可以从一个表中读取相同的行,在事务持续期间,禁止其他事务对该表执行插入、更新和删除操作,可避免所有并发问题,但性能低。

MySQL支持四种事务隔离级别,其中REPEATABLE READ为默认事务隔离级别。

 

设置说明:隔离级别越高,越能保证数据的完整性和一致性,但对并发性的影响越大。对于大多数应用程序,数据库系统的隔离级别设为ReadCommitted。能避免脏读取,而且具有较好的并发性能。对于不可重复读、虚读和第二类丢失更新这些并发问题,采用悲观锁或乐观锁。

悲观锁和乐观锁

悲观锁:每次拿数据时怕别人会修改,所以都会先上锁,当其他事务要访问该数据时就会阻塞。一般用在表锁、行锁、读锁和写锁,在操作前先上锁。

乐观锁:每次拿数据时认为别人不会修改,不会上锁,但在更新时会先判断一下在此期间别人是否有更新该数据,可以使用版本号等机制。

适用于:读取多、写少的情况,可以提高吞吐量。

DB2事务隔离级别:

(1)Uncommitted read(UR——未提交读)

读取数据时,对表加IN表锁,而不会对数据行加锁。修改数据时,则在数据上加X锁以及相应表级别锁(修改操作与CS处理相同)。

并发性:丢失更新、脏读、不可重复读和虚读都有可能发生

(2)Cursor stability(CS——游标稳定性)默认级别:仅锁住当前处理的记录

锁定游标定位的当前行。读取加NS锁,修改加X锁,带有修改的查询加U锁。锁定持续到读取下一条或事务结束。

并发性:丢失更新和脏读不会发生;但有可能出现不可重复读和虚读。

(3)Read statility(RS——读稳定性)

只是锁定事务实际检索和修改的行(读取的话加NS,修改的话加X,有修改意向加U)

并发性:丢失更新、脏读、不可重复读不会发生;但有可能出现虚读。

(4)Repeatable read(RR)

会对select的所有行加锁,对所有扫描的行加锁

并发性:丢失更新、脏读、不可重复读和虚读都不会发生

猜你喜欢

转载自my.oschina.net/u/2277088/blog/1630189