数据库事物并发---事物隔离机制

数据库事物并发---事物隔离机制

(2010-09-06 13:38:37)
标签:

杂谈

 

ISOLATIONLEVELS

SQL规定了以下隔离级别:
ReadUncommited: 读已提交的。
ReadCommited:仅读已提交的数据。显然,可以防止脏读。但是它不能保证此数据在本事务完成之前不被其他事务修改,所以有可能发生不可重复读现象。
ReadRepeatable:给本事务读的所有数据加上共享锁,这样可以防止不可重复读,因为其他事务无法在本事务完成之前修改这些数据。但是幻觉读仍有可能出现,因为另一个事务可以向该表中插入某些数据。
ReadSerializable: 仅读已串行化的数据,这表明,幻觉读是不可能出现的了。

数据库调度的特征:
  • 基于可恢复性的调度,可恢复的调度(recoverableschedule):是指已提交的事务不应该发生回滚的调度,它可以分为以下几类:
  1. 层联回滚(Cascadingrollback)调度:未提交的事务从未提交的(失败)事务中读取了错误的数据(Dirty Read),必须回滚。
  2. 无层联回滚的:事务只读取已提交事务写的数据(Read Commited)。
  3. 严格调度(StrictSchedule):在写数据项的最后一个事务提交之后事务才能开始读/写该数据项。
  • 基于可串行化的调度(略);
数据库并发控制实现技术:
  • 加锁协议(Locking Protocol) :
    • 可以加Read_LockWrite_Lock(也就是以前讲的共享锁和互斥锁)。
 Well-formed:一个事务是良形式的,若它不会去给一个已加锁的对象再次加锁,也不会对一个已经释放锁的对象再次释放锁。

  • 为了保证事务的可串行性,事务必须遵循以下规则- 称作Two Phase LockingScheme(2PL),在这个协议里,食物可以分为两个阶段:
  1. Growingphase: 只加锁,不释放锁(但是可以进行锁升级);
  2. Shrinkingphase: 只释放锁,不加锁(但是可以进行锁降级);
所谓的锁升级(降级)是指对同一个对象的读锁变为写锁(或反过来)。若事务满足了这两个特征,便是 可串行化的(Serializable)原因不难分析,简单的说,因为在一个事务在执行某个操作前必须得到其读/写对象的锁(在此之前不能释放锁),若不能得到就只有等待其他事务释放该锁(而其他事务一旦开始释放锁就不能再申请锁),故对于冲突的操作在两个不同的事务之间只能按一定顺序执行(在优先图中表现为没有环)-对于非冲突的操作则可以按任意次序执行

这里还可以看到,满足2PL的调度能大量地减少并行度。并且在2PL中申请锁与释放锁这两个过程完全独立,与具体封锁的数据对象无关,所以2PL只能与串行执行集的一个子集等价,换句话说, 2PL对于可串行化来说太严格了( 2PLis 2 strict 4 serializablity)。

但是满足2PL
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值