数据库的隔离级别及其封锁协议

这几天复习Hibernate,发现对数据库基础的一些概念还没有了解清楚,因此找出以前的课本数据库系统概论,又在网上Google了下,总算清楚了好多..

 

为了说有关数据库的隔离级别,先解释下一些概念。

首先要知道的是设置数据库的隔离级别是为了进行并发控制。

下面是由于对数据库的并发访问所造成的5类问题:

1. 第一类丢失修改(Lost Update)【回滚丢失】:当2个事务更新相同的数据源,如果第一个事务被提交,而另外一个事务却被撤销,
    那么会连同第一个事务所做的跟新也被撤销。也就是说第一个事务做的跟新丢失了。

   这种问题在数据库中基本不会出现

2.脏读(dirty read):当一个事务读取另一个事务尚未提交的修改时,产生脏读。

 

3.不可重复读(non-repeatable read):是指在一个事务内,多次读同一数据。在这个事务还没有结束时,另外一个事务也访问该同一数据。那么,在第一个事务中的两次读数据之间,由于第二个事务的修改,那么第一个事务两次读到的的数据可能是不一样的。这样就发生了在一个事务内两次读到的数据是不一样的,因此称为是不可重复读。

 

4.第二类丢失修改(Second lost updates problem): 无法重复读取的特例。有两个并发事务同时读取同一行数据,然后其中一个对它进行修改提交,而另一个也进行了修改提交。这就会造成第一次写操作失效。

 

5.幻像读(phantom read):: 是指当事务不是独立执行时发生的一种现象,例如第一个事务对一个表中的数据进行了修改,这种修改涉及到表中的全部数据行。同时,第二个事务也修改这个表中的数据,这种修改是向表中插入一行新数据。那么,以后就会发生操作第一个事务的用户发现表中还有没有修改的数据行,就好象发生了幻觉一样。

 

对于3与5的区别:

不可重复读的重点是修改 : 同样的条件 ,   你读取过的数据 ,   再次读取出来发现值不一样了
幻读的重点在于新增或者删除 同样的条件 ,   第 1 次和第 2 次读出来的记录数不一样

下面是数据库的四个隔离级别(在数据库的四种隔离级别中都可以解决的一个问题就是第一类丢失更新)

 

1.Serializable:可以解决以上5个问题,使以上五个问题都不会出现。

2.Repeatable Read(可重复读): 在一个事务内进行多次数据查询时,保证多次查询的结果是一致的.

 读事务会阻塞写事务,但是读事务不会阻塞读事务,但是写事务会阻塞写事务和读事务。因为读事务阻塞了写事务,样以来就不会造成不可重复读的问题。

3.Read Commited(提交读):在一个事务中,发出的SQL语句对数据进行了操作并提交后,其它事务才可以查询到操作后的数据。
在脏读这个问题中,A事务不可以读取到B事务未提交的更改,所以可以解决脏读的问题。对于虚读/不可重复读/第二类丢失更新的问题,由于B事务的操作已提交,所以A事务依然可以查询到B事务所操作的数据,因此虚读/不可重复读/第二类丢失更新的问题不能解决。

写事务就会阻塞读事务和写事务,但是读事务不会阻塞读事务和写事务,这样因为写事务会阻塞读取事务,那么从而读取事务就不能读到脏数据,但是因为读事务不会阻塞其它的事务,这样还是会造成不可重复读的问题。

4.Read Uncommited(未提交读):在一个事务中,只要发出了SQL语句对数据进行了操作而未提交,其它事务均可马上查询到操作后的数据,所以这种隔离级别并不能解决其它四个问题。

读事务不会阻塞读事务和写事务,写事务也不会阻塞读事务,但是会阻塞写事务。这样造成的一个结果就是当一个写事务没有提交的时候,读事务照样可以读取,那么造成了脏读的现象。

 

 

数据库的默认隔离级别:
大多数数据库的默认隔离级别为: Read Commited,如Sql Server , Oracle.
少数数据库默认的隔离级别为Repeatable Read, 如MySQL InnoDB存储引擎  

 

几种锁:

 排他锁:X锁  其他事务在T释放A上的锁之前不能在读取和修改A 
 共享锁:S锁   其他事务可以读A,但在T释放A上的S锁之前不能对A做任何修改
 修改锁(Update Lock):将要修改的数据加Update锁(并非所有DBMS都有)

 

封锁协议:

一级封锁协议
在事务修改数据的时候加x锁,直到事务结束(提交或者回滚)释放x锁。
事务T读数据不加锁
一级封锁协议可以有效的防止丢失更新,但是不能防止脏读不可重复读的出现。

 

 

 

 

 

 


二级封锁协议:
在一级封锁的基础上事务读数据的时候加s锁,读取之后释放。二级封锁协议可以防止丢失更新,脏读。不能防止不可重复读。


三级封锁协议:
在一级封锁的基础上事务读数据的时候加s锁,直到事务结束释放。二级封锁协议可以防止丢失更新,脏读,不可重复读。


两阶段封锁协议,可串行性封锁协议:
 1)事务中,在对任何数据读写前首先要获得对数据的锁,称扩展阶段
 2)在释放一个锁以后,不再申请任何锁,称收缩阶段

 

封锁协议和隔离级别并不是严格对应的,在封锁协议中的丢失更新是指第二类丢失更新

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值