数据库事物隔离级别

补充:

1、脏读:事物一读到了事物二尚未提交的数据(如果事物二失败回滚的情况下,则事物一读到的数据则是无效的,或者说垃圾)

              产生级别:读未提交

              解决需要级别: 读已提交

 

2、不可重复读:事物一在二次或多次读取数据时,读到了不同的数据。原因是事物二在中间修改了其中的数据。

              产生级别:读已提交

              解决需要级别: 可重复读

3、幻读: 事物一修改了部分数据,事物二添加了新的并且符合事物一的条件的数据。造成事物一发现有新的数据没有修改,称幻觉。

              产生级别: 可重复读

              解决需要级别:串行化



事务隔离级别(transaction isolationlevels):隔离级别就是对对事务并发控制的等级。ANSI/ISO SQL将其分为串行化(SERIALIZABLE)、可重复读(REPEATABLEREAD)、读已提交(READ COMMITED)、读未提交(READUNCOMMITED)四个等级。为了实现隔离级别通常数据库采用锁(Lock)。一般在编程的时候只需要设置隔离等级,至于具体采用什么锁则由数据库来设置。首先介绍四种等级,然后举例解释后面三个等级(可重复读、读已提交、读未提交)中会出现的并发问题。

串行化(SERIALIZABLE):所有事务都一个接一个地串行执行,这样可以避免幻读(phantomreads)。对于基于锁来实现并发控制的数据库来说,串行化要求在执行范围查询(如选取年龄在10到30之间的用户)的时候,需要获取范围锁(rangelock)。如果不是基于锁实现并发控制的数据库,则检查到有违反串行操作的事务时,需要滚回该事务。

可重复读(REPEATABLEREAD):所有被Select获取的数据都不能被修改,这样就可以避免一个事务前后读取数据不一致的情况。但是却没有办法控制幻读,因为这个时候其他事务不能更改所选的数据,但是可以增加数据,因为前一个事务没有范围锁。

读已提交(READCOMMITED):被读取的数据可以被其他事务修改。这样就可能导致不可重复读。也就是说,事务的读取数据的时候获取读锁,但是读完之后立即释放(不需要等到事务结束),而写锁则是事务提交之后才释放。释放读锁之后,就可能被其他事物修改数据。该等级也是SQLServer默认的隔离等级。

读未提交(READ UNCOMMITED):这是最低的隔离等级,允许其他事务看到没有提交的数据。这种等级会导致脏读(DirtyRead)。

 

综上述,可以等到下面的表格:

 

隔离等级

脏读

不可重复读

幻读

读未提交

YES

YES

YES

读已提交

NO

YES

YES

可重复读

NO

NO

YES

串行化

NO

NO

NO

 

注:事物隔离级别是依据一个事物进行查询(Select,可能是一次或多次)时的数据是否“正确”为依据而定义的。(理解)


 

各大数据库默认隔离级别:

Oracle:Read Committed

SQL Server:Read Committed

MySql:( InnoDB )  Repeatable Read


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值