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

1.2PL

2PL定义:1.所有的读写操作之前均需加锁;2.解锁操作后不允许再出现加锁操作;

S锁:加S锁后其他事务可读,不可写,直至加锁事务结束;

X锁:加X锁后其他事务均不可以读或写,直至事务结束;

事务执行的过程分为两个阶段,一是获得封锁阶段,二是释放封锁阶段;2PL可能产生死锁;

2PL可以防止读脏数据、丢失修改等;是事务可串行化的必要条件,不是充分条件;

可串行化:多个操作并发执行时,如不进行并发控制,可能出现错误的结果。但如果把所有并发操作全部串行执行,又失去了并发操作的优势。所以提出了可串行化的概念。可串行性:当且仅当一组事务的交叉执行结果与某一串行执行的执行结果一致时,这组事务具有可串行性;

2.一级锁、二级锁、三级锁

一级锁:所有写操作之前加X锁,事务结束释放,可以防止丢失修改;

二级锁;所有写操作之前加X锁,事务结束释放;所有读操作前加S锁,操作结束释放,可以防止丢失修改和读脏数据;

三级锁:所有写操作之前加X锁,事务结束释放;所有读操作前加S锁,事务结束释放,可以防止丢失修改、读数据和不可重复读;

二、范式

第一范式:属性不可分;

第二范式:所有非主属性完全依赖于码;

第三范式:符合2NF,同时没有传递依赖;

BC范式:符合3NF,且主属性不依赖于主属性;即若R属于1NF,且所有属性不传递依赖于码;每个非平凡依赖关系的左边均包含键码;每个依赖关键的决定因素必须包含键码;

4NF:要求把同一表内的n:m的关系删除;

时间: 2024-11-05 10:35:15

数据库的2PL两段锁协议与范式的相关文章

数据库的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. 两段锁协议: 数据库的两段锁协议是指所有事务必须分两个阶段对数据项进行加锁和解

两段锁协议(2PL)

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

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

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

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

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

理解MySql事务隔离机制、锁以及各种锁协议

一直以来对数据库的事务隔离机制的理解总是停留在表面,其内容也是看一遍忘一边.这两天决定从原理上理解它,整理成自己的知识.查阅资料的过程中发现好多零碎的概念如果串起来足够写一本书,所以在这里给自己梳理一个脉络,具体的内容参考引文或在网上搜一下.由于平时接触最多的是MySQL,所以文章中某些部分是MySQL特有的特性,请读者注意. 数据库并发操作会引发的问题: 多个事务同时访问数据库时候,会发生下列5类问题,包括3类数据读问题(脏读,不可重复读,幻读),2类数据更新问题(第一类丢失更新,第二类丢失更

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

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

网上资料笔记总结!!数据库事务并发问题,锁机制和对应的4种隔离级别

数据库事务并发问题 数据库的操作通常为写和读,就是所说的CRUD:增加(Create).读取(Read).更新(Update)和删除(Delete).事务就是一件完整要做的事情.事务是恢复和并发控制的基本单位.事务必须始终保持系统处于一致的状态,不管在任何给定的时间并发事务有多少.事务在关系数据库中,一个事务可以是一条SQL语句,一组SQL语句或整个程序.是数据库中各种数据项的一个程序执行单元.事务是用户定义的一个操作序列(多个表同时读写).这些操作要么都做,要么都不做,是一个不可分割的工作单位

java合并两段音频成一段 同时播放类似伴奏

/** * * @param partsPaths 要合成的音频路径数组 * @param unitedFilePath 输入合并结果数组 */ public void uniteWavFile(String[] partsPaths, String unitedFilePath) { byte byte1[] = getByte(partsPaths[0]); byte byte2[] = getByte(partsPaths[1]); byte[] out = new byte[byte1.

两段检验系统生成的identityHashCode是否重复的代码

前言:承接上一篇hashCode和identityHashCode 的关系,下面的两段简单的程序主要是检验一下系统生成的identityHashCode是否存在重复的情况. 1:可以自由控制生成对象的个数,并且不受测试的类是否重写hashCode()方法的影响 import java.util.HashSet; import java.util.Set; public class CheckSystemIdentity { public static void main(String args[