标准SQL规范中定义的四个事务隔离级别

数据库操作面临的问题:脏读、不可重复读、幻读、更新丢失。

脏读

指一个事务读取了另一个事务未提交的记录。当一个事务正在访问数据,并且对数据进行了修改,而这种修改还没有提交到数据库中;另外一个事务也访问这个数据,然后使用了这个未提交的数据。因为这个数据还没有提交,那么第二个事务读取到的是脏数据,依据脏数据所做的操作可能是不正确的。

不可重复读

指在一个事务内,多次重复执行某个查询,返回的记录不一致。例如:在一个事务还没有结束时,另外一个事务修改了该数据;在第一个事务中的两次读数据之间,由于第二个事务的修改,导致两次读取到的数据可能是不一样的。这样就发生了在一个事务内两次读到的数据是不一样的,因此称为是不可重复读。

幻读

指当事务不是独立执行时发生的一种现象,例如:第一个事务对表中的数据进行了批量修改(status=2);同时第二个事务也修改这个表中的数据,向表中插入一行新数据(status=1),插入的数据刚好满足第一个事务的修改条件;操作第一个事务的用户发现表中还存在没有修改的数据行(status=1),就好象发生了幻觉一样。

更新丢失

两个事务都同时更新一行数据,一个事务对数据的更新把另一个事务对数据的更新覆盖了。这是因为系统没有执行任何的锁操作,因此并发事务并没有被隔离开来。


事物隔离级别

为了避免上面出现的几种情况,在标准SQL规范中,定义了4个事务隔离级别,不同的隔离级别对事务的处理不同。

读未提交

读未提交(Read Uncommitted):允许脏读取,但不允许更新丢失。如果一个事务已经开始写数据,则另外一个事务则不允许同时进行写操作,但允许其他事务读此行数据。该隔离级别可以通过“排他写锁”实现。

读已提交

读已提交(Read Committed):允许不可重复读取,但不允许脏读取。这可以通过“共享读锁”和“排他写锁”实现。读取数据的事务允许其他事务继续访问该行数据,但是未提交的写事务将会禁止其他事务访问该行。

可重复读取(Repeatable Read)

可重复读取(Repeatable Read):禁止不可重复读取和脏读取,但是有时可能出现幻读数据。这可以通过“共享读锁”和“排他写锁”实现。读取数据的事务将会禁止写事务(但允许读事务),写事务则禁止任何其他事务。

串行操作(Serializable)

串行化(Serializable):提供严格的事务隔离。它要求事务串行化执行,事务只能一个接着一个地执行,不能并发执行。仅仅通过“行级锁”是无法实现事务序列化的,必须通过其他机制保证新插入的数据不会被刚执行查询操作的事务访问到。
隔离级别越高,越能保证数据的完整性和一致性,但是对并发性能的影响也越大。对于多数应用程序,可以优先考虑把数据库系统的隔离级别设为Read Committed。它能够避免脏读取,而且具有较好的并发性能。尽管它会导致不可重复读、幻读和第二类丢失更新这些并发问题,在可能出现这类问题的个别场合,可以由应用程序采用悲观锁或乐观锁来控制。

  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值