数据库的S锁和X锁,两段锁协议

基本的封锁类型有两种:排它锁(X锁)和共享锁(S锁).所谓X锁,是事务T对数据A加上X锁时,只允许事务T读取和修改数据A,...所谓S锁,是事务T对数据A加上S锁时,其他事务只能再对数据A加S锁,而不能加X锁,直到T释放A上的S锁。
若事务T对数据对象A加了S锁,则T就可以对A进行读取,但不能进行更新(S锁因此又称为读锁),在T释放A上的S锁以前,其他事务可以再对A加S锁,但不能加X锁,从而可以读取A,但不能更新A.

两段锁协议:

数据库的两段锁协议是指所有事务必须分两个阶段对数据项进行加锁和解锁

1.扩展阶段

在对任何数据项的读、写之前,要申请并获得该数据项的封锁。

2.收缩阶段

每个事务中,所有的封锁请求必须先于解锁请求。

例如:事务T遵循两段锁协议,其封锁协议为:

BEGIN TRANSACTION;

LOCK(A);READ A; A := A + 100; WRITE A; LOCK(B); UNLOCK(A); READ(B), UNLOCK(B),;

COMMIT;

可以证明:若并发执行的所有事务均遵守两段锁协议,则对这些并行事务的任何并行调度策略都是可串行化

需要说明的是,并发执行的所有事务若均遵守两段锁协议,只是这些事务的并行调度策略能可串行化的充分条件,不是必要条件。

两段锁协议与防止死锁的一次封锁法的区别:

一次封锁法要求事务必须一次对所有要使用到的数据项进行加锁,否则不能继续运行。

显然,一次封锁法符合两段锁协议,但是两段锁协议并不要求一次就要对所有需要用到的数据项进行加锁,因此遵守两段锁协议的事务有可能死锁

时间: 2024-08-02 18:06:00

数据库的S锁和X锁,两段锁协议的相关文章

两段锁协议(2PL)

1.可串行性 并行操作对并行事务的操作的调度是随机的,不同的调度可能产生不同的结果.在这些不同的调度中,肯定有些调度的结果是正确的,究竟哪些调度是正确的呢? 若每个事务的基本操作都串连在一起,没有其它事务的操作与之交叉执行,这样的调度称为串行调度,多个事务的的串行调度,其执行结果一定是正确的.但串行调度限制了系统并行性的发挥,而很多并行调度又不具有串行调度的结果,所以我们必须研究具有串行调度效果的并行调度方法. 定义:当且仅当某组并发事务的交叉调度产生的结果和这些事务的某一串行调度的结果相同,则

两段锁协议(Two-Phase Locking――2PL)

两段锁协议(Two-Phase Locking――2PL) 两段锁协议规定所有的事务应遵守的规则: ① 在对任何数据进行读.写操作之前,首先要申请并获得对该数据的封锁. ② 在释放一个封锁之后,事务不再申请和获得其它任何封锁. 即事务的执行分为两个阶段: 第一阶段是获得封锁的阶段,称为扩展阶段. 第二阶段是释放封锁的阶段,称为收缩阶段. 例如 --------------------- 作者:Mat的学习过程 来源:CSDN 原文:https://blog.csdn.net/aigoogle/a

数据库的2PL两段锁协议与范式

1.2PL 2PL定义:1.所有的读写操作之前均需加锁:2.解锁操作后不允许再出现加锁操作: S锁:加S锁后其他事务可读,不可写,直至加锁事务结束: X锁:加X锁后其他事务均不可以读或写,直至事务结束: 事务执行的过程分为两个阶段,一是获得封锁阶段,二是释放封锁阶段:2PL可能产生死锁: 2PL可以防止读脏数据.丢失修改等:是事务可串行化的必要条件,不是充分条件: 可串行化:多个操作并发执行时,如不进行并发控制,可能出现错误的结果.但如果把所有并发操作全部串行执行,又失去了并发操作的优势.所以提

07 | 行锁功过:怎么减少行锁对性能的影响?

在上一篇文章中,我跟你介绍了MySQL的全局锁和表级锁,今天我们就来讲讲MySQL的行锁. MySQL的行锁是在引擎层由各个引擎自己实现的.但并不是所有的引擎都支持行锁,比如MyISAM引擎就不支持行锁.不支持行锁意味着并发控制只能使用表锁,对于这种引擎的表,同一张表上任何时刻只能有一个更新在执行,这就会影响到业务并发度.InnoDB是支持行锁的,这也是MyISAM被InnoDB替代的重要原因之一. 我们今天就主要来聊聊InnoDB的行锁,以及如何通过减少锁冲突来提升业务并发度. 顾名思义,行锁

web开发中的两把锁之数据库锁:(高并发--乐观锁、悲观锁)

这篇文章讲了 1.同步异步概念(消去很多疑惑),同步就是一件事一件事的做:sychronized就是保证线程一个一个的执行. 2.我们需要明白,锁机制有两个层面,一种是代码层次上的,如Java中的同步锁,典型的就是同步关键字synchronized ( 线    程级别的).另一个就是数据库层次上的,比较典型的就是悲观锁和乐观锁. 3.常见并发同步案例分析   附原文链接 http://www.cnblogs.com/xiohao/p/4385508.html 对于我们开发的网站,如果网站的访问

解决并发问题,数据库常用的两把锁——悲观锁,乐观锁

一.概念: 乐观锁:适用于写少读多的情景,因为这种乐观锁相当于java的cas(比较并替换),所以多条数据同事过来的时候不用等待,可以立即进行返回 悲观锁:适用于写多读少的情景,这种情况也相当于java的synchronized,reentrantLock等,大量数据过来的时候,只有一条被写入,其他数据需要等待,智行完成后下一条数据继续. 二:实现方式: 乐观锁:采用版本号的方式.即当前版本号如果对应上了就可以写入数据,如果判断当前版本号不一致,那么就不会更新成功. 比如 update tabl

数据库进阶之路(五) - MySQL行锁深入研究

由于业务逻辑的需要,必须对数据表的一行或多行加入行锁,举个最简单的例子,图书借阅系统:假设id=1的这本书库存为1,但是有2个人同时来借这本书,此处的逻辑为: SELECT restnum FROM book WHERE id =1 ; --如果restnum大于0,执行update UPDATE book SET restnum=restnum-1 WHERE id=1; 问题来了,当2个人同时借的时候,有可能第一个人执行select语句的时候,第二个人插了进来,在第一个人没来得及更新book

MySQL数据库锁机制之MyISAM引擎表锁和InnoDB行锁详解

MySQL中的锁概念 Mysql中不同的存储引擎支持不同的锁机制.比如MyISAM和MEMORY存储引擎采用的表级锁,BDB采用的是页面锁,也支持表级锁,InnoDB存储引擎既支持行级锁,也支持表级锁,默认情况下采用行级锁. Mysql3中锁特性如下: 表级锁:开销小,加锁块:不会出现死锁,锁定粒度大,发生锁冲突的概率最高,并发度最低. 行级锁:开销大,加锁慢:会出现死锁:锁定粒度最小,发生锁冲突的概率最低,并发性也最高. 页面锁:开销和加锁界于表锁和行锁之间,会出现死锁:锁定粒度界与表锁和行锁

查看Oracle数据库被锁住的表,删除锁表的进程

锁表处理及查询 查看Oracle数据库被锁住的表,删除锁表的进程 1.查看被锁住的表 SELECT dob.object_name table_name,    lo.locked_mode, lo.session_id, vss.serial#, vss.action action, vss.osuser osuser, vss.logon_time, vss.process ap_pid, vps.spid db_pid FROM v$locked_object lo, dba_object