数据库的封锁

封锁就是事务T在对某个数据对象操作之前,先向系统发出请求,对其加锁。加锁后事务T就对该数据对象有了一定的控制,在事务T释放它的锁之前,其他事务不能更新此数据对象。

基本封锁类型有两种:排它锁(exclusive locks,简称X锁)又称为写锁,和共享锁(share locks,简称S锁)又称为读锁。

1、一级封锁协议

一级封锁协议是指,事务T在修改数据R之前必须先对其加X锁,直到事务结束才释放。事务结束包括正常结束(COMMIT)和非正常结束(ROLLBACK)。

一级封锁协议可防止丢失修改,并保证事务T是可恢复的。

2、二级封锁协议

二级封锁协议是指,在一级封锁协议基础上增加事务T在读取数据R之前必须先对其加S锁,读完后即可释放S锁。

二级封锁协议除防止丢失修改,还可进一步防止读“脏”数据。

3、三级封锁协议

三级封锁协议是指,在一级封锁协议的基础上增加事务T在读取数据R之前必须先对其加S锁,直到事务结束才释放。

三级封锁协议除了防止丢失修改和读“脏”数据外,还进一步防止了不可重复读。

 

可串行化调度

多个事务的并发执行是正确的,当且仅当其结果与按某一次串行地执行这些事务时的结果相同,称这种调度策略为可串行化调度。

两段锁协议

两段锁协议是指所有事务必须分为两个阶段对数据项加锁和解锁。

  • 在对任何数据进行读、写操作之前,首先要申请并获得对该数据的封锁;
  • 在释放一个封锁之后,事务不再申请和获得任何其他封锁。

所谓的“两段”锁的含义是,事务分为两个阶段,第一阶段是获得封锁,也称为扩展阶段,在这个阶段,事务可以申请获得任何数据项上的任何类型的锁,但是不能释放任何锁;第二阶段是释放封锁,也称为收缩阶段,在这个阶段,事务可以释放任何数据项上的任何类型的锁,但是不能在申请任何锁。

事务遵守两段锁协议是可串行化调度的充分条件,而不是必要条件。

你可能感兴趣的:(mysql)