标签: 杂谈 |
ISOLATIONLEVELS
SQL规定了以下隔离级别:ReadUncommited: 读已提交的。
ReadCommited:仅读已提交的数据。显然,可以防止脏读。但是它不能保证此数据在本事务完成之前不被其他事务修改,所以有可能发生不可重复读现象。
ReadRepeatable:给本事务读的所有数据加上共享锁,这样可以防止不可重复读,因为其他事务无法在本事务完成之前修改这些数据。但是幻觉读仍有可能出现,因为另一个事务可以向该表中插入某些数据。
ReadSerializable: 仅读已串行化的数据,这表明,幻觉读是不可能出现的了。
数据库调度的特征:
- 基于可恢复性的调度,可恢复的调度(recoverableschedule):是指已提交的事务不应该发生回滚的调度,它可以分为以下几类:
- 层联回滚(Cascadingrollback)调度:未提交的事务从未提交的(失败)事务中读取了错误的数据(Dirty Read),必须回滚。
- 无层联回滚的:事务只读取已提交事务写的数据(Read Commited)。
- 严格调度(StrictSchedule):在写数据项的最后一个事务提交之后事务才能开始读/写该数据项。
- 基于可串行化的调度(略);
- 加锁协议(Locking Protocol) :
- 可以加Read_Lock和Write_Lock(也就是以前讲的共享锁和互斥锁)。
- 可以加Read_Lock和Write_Lock(也就是以前讲的共享锁和互斥锁)。
- 为了保证事务的可串行性,事务必须遵循以下规则- 称作Two Phase LockingScheme(2PL),在这个协议里,食物可以分为两个阶段:
- Growingphase: 只加锁,不释放锁(但是可以进行锁升级);
- Shrinkingphase: 只释放锁,不加锁(但是可以进行锁降级);
这里还可以看到,满足2PL的调度能大量地减少并行度。并且在2PL中申请锁与释放锁这两个过程完全独立,与具体封锁的数据对象无关,所以2PL只能与串行执行集的一个子集等价,换句话说, 2PL对于可串行化来说太严格了( 2PLis 2 strict 4 serializablity)。
但是满足2PL