精华内容
下载资源
问答
  • java并发基本概念和级别

    千次阅读 2017-04-01 10:23:28
    关于java并发的一些概念:并发(Concurrency)和并行(Parallelism) 临界区 阻塞(Blocking)和非阻塞(Non-Blocking)死锁(Deadlock)、饥饿(Starvation)和活锁(Livelock)并发级别 阻塞(Blocking)无饥饿...

    之前买了一本实战Java高并发程序设计,这里记一下笔记,至于书怎么样,读完之后再看值不值得推荐。先提供下试读pdf的[下载地址]

    关于java并发的一些概念:

    并发的概念:

    并发(Concurrency)和并行(Parallelism)

    并发偏重于多个任务交替执行,而多个任务之间有可能还是串行的。而并行是真正意义上的“同时执行”。严格意义上来说,并行的多个任务是真实的同时执行,而对于并发来说,这个过程只是交替的,一会儿运行任务A一会儿执行任务B,系统会不停地在两者间切换。但对于外部观察者来说,即使多个任务之间是串行并发的,也会造成多任务间是并行执行的错觉。真实的并行也只可能出现在拥有多个CPU的系统中(比如多核CPU)。

    临界区

    临界区用来表示一种公共资源或者说是共享数据,可以被多个线程使用。但是每一次,只能有一个线程使用它,一旦临界区资源被占用,其他线程要想使用这个资源,就必须等待。

    阻塞(Blocking)和非阻塞(Non-Blocking)

    阻塞和非阻塞通常用来形容多线程间的相互影响。比如一个线程占用了临界区资源,那么其他所有需要这个资源的线程就必须在这个临界区中进行等待。等待会导致线程挂起,这种情况就是阻塞。非阻塞的意思与之相反,它强调没有一个线程可以妨碍其他线程执行。所有的线程都会尝试不断前向执行。

    死锁(Deadlock)、饥饿(Starvation)和活锁(Livelock)

    死锁、饥饿和活锁都属于多线程的活跃性问题。如果发现上述几种情况,那么相关线程可能很难再继续往下执行了。
    死锁是几个线程彼此之间相互占用了其它线程的资源,如果大家都不愿意释放自己的资源,那么这个状态将永远维持下去。与死锁相比,饥饿还是有可能在未来一段时间内解决的(比如高优先级的线程已经完成任务,不再疯狂的执行)。活锁是一种有趣的情况,比如当你要坐电梯下楼,电梯到了,门开了,这时你正准备出去。但很不巧的是,门外一个人挡着你的去路,他想进来。然后你们向同一个方向礼让,结果,你们俩就又撞上了……

    并发的级别

    由于临界区的存在,多线程之间的并发必须受到控制。根据控制并发的策略,可以把并发的级别进行分类,大致上可以分为阻塞、无饥饿、无障碍、无锁、无等待几种。

    阻塞(Blocking)

    一个线程是阻塞的,那么在其他线程释放资源之前,当前线程无法继续执行。当我们使用synchronized关键字,或者重入锁时就会产生阻塞的线程。无论是synchronized或者重入锁,都会试图在执行后续代码前,得到临界区的锁,如果得不到,线程就会被挂起等待,直到占有了所需资源为止。

    无饥饿(Starvation-Free)

    这个取决于线程之间是否有优先级的存在,如果系统允许高优先级的线程插队。这样有可能导致低优先级线程产生饥饿。

    无障碍(Obstruction-Free)

    无障碍是一种最弱的非阻塞调度。两个线程如果是无障碍的执行,那么他们不会因为临界区的问题导致一方被挂起。换言之,大家都进入临界区了。那么如果一起修改共享数据,把数据改坏了可怎么办呢?对于无障碍的线程来说,一旦检测到这种情况,它就会立即对自己所做的修改进行回滚,确保数据安全。如果说阻塞的控制方式是悲观策略,相对来说非阻塞的调度就是一种乐观的策略。
    从这个策略中也可以看到,当临界区中存在严重的冲突时,所有的线程可能都会不断地回滚自己的操作,而没有一个线程可以走出临界区。这种情况会影响系统的正常执行。
    一种可行的无障碍实现可以依赖一个“一致性标记”来实现。线程在操作之前,先读取并保存这个标记,在操作完成后,再次读取,检查这个标记是否被更改过,如果两者是一致的,则说明资源访问没有冲突。如果不一致,则说明资源可能在操作过程中与其他写线程冲突,需要重试操作。而任何对资源有修改操作的线程,在修改数据前,都需要更新这个一致性标记,表示数据不再安全。

    无锁(Lock-Free)

    无锁的并行都是无障碍的。在无锁的情况下,所有的线程都能尝试对临界区进行访问,但不同的是,无锁的并发保证必然有一个线程能够在有限步内完成操作离开临界区,一个典型的特点是可能会包含一个无穷循环。在这个循环中,线程会不断尝试修改共享变量。如果修改成功,程序退出,否则继续尝试修改。但无论如何,无锁的并行总能保证有一个线程是可以胜出的。至于临界区中竞争失败的线程,它们则不断重试,直到自己获胜。如果总是尝试不成功,则会出现类似饥饿的现象,线程会停止不前。

    无等待(Wait-Free)

    无锁只要求有一个线程可以在有限步内完成操作,而无等待则在无锁的基础上更进一步进行扩展。它要求所有的线程都必须在有限步内完成,这样就不会引起饥饿问题。如果限制这个步骤上限,还可以进一步分解为有界无等待和线程数无关的无等待几种,它们之间的区别只是对循环次数的限制不同。一种典型的无等待结构就是RCU(Read-Copy-Update)。它的基本思想是,对数据的读可以不加控制。因此,所有的读线程都是无等待的,它们既不会被锁定等待也不会引起任何冲突。但在写数据的时候,先取得原始数据的副本,接着只修改副本数据(这就是为什么读可以不加控制),修改完成后,在合适的时机回写数据。

    展开全文
  • 采用读写锁来进行并发控制,提高并发性的方式就是让锁定的对象更有选择性,只锁定部分数据,而不是所有的资源,这就是锁粒度要考虑的问题。 表锁:MySQL最基本的锁策略,开销最小的策略。它会锁定整张表,用户...

    内容源于《高性能MySQL》

    一、MySQL逻辑架构

    架构图:
    这里写图片描述

    最上层不是Mysql独有的, 比如连接处理,授权认证, 安全 等等
    第二层核心服务功能,包括查询解析,分析,优化,缓存以及所有内置函数,存储过程,触发器,视图等都在这层实现
    第三层 存储引擎,存储引擎API包含几十个底层函数

    二、优化与执行
    什么是优化: MySQL解析查询,并创建内部数据结构(解析树),然后对其进行各种优化,包括重写查询,决定表的读取顺序,以及选择合适的索引等。 (用户可以通过特殊的关键字提示优化器,影响它的决策过程。也可以请求优化器解释优化过程的各个因素)

    三、并发控制
    采用读写锁来进行并发控制,提高并发性的方式就是让锁定的对象更有选择性,只锁定部分数据,而不是所有的资源,这就是锁粒度要考虑的问题。

    表锁:MySQL最基本的锁策略,开销最小的策略。它会锁定整张表,用户对表进行写操作前,先获得写锁,这会阻塞其他用户对该表的所有读写操作。只有没有写锁时,其他读取用户才能获得读锁,读锁之间是不相互阻塞的。

    行级锁:行级锁可以最大程度地支持并发处理(最大锁开销),InnoDB和XtraDB,还有其他一些存储引擎中实现了行级锁,行级锁只在存储引擎层实现,而MySQL服务器层没有实现。

    四、事务
    事务这个概念比较基础,就不过多介绍。 记住一句话要么都做,要么都不做的。 还有ACID四大特征:原子性,一致性(从一个一致性的状态转换到另一个一致性的状态),隔离性,持久性。

    五、隔离级别
    四种隔离级别
    1. READ UNCOMMITED(未提交读)
    其他事物可以读取未提交数据,会导致脏读(读脏数据),这种会导致很多问题,一般不采用。
    2. READ COMMITED(提交读)
    事务提交之前,所做的任何修改对其他事务不可见,也叫不可重复读,同一个事务执行两次相同的查询,可能得到不一样的结果。
    3. REPEATABLE READ(可重复读)
    保证了在同一个事务中多次读取同样记录的结果是一致的。但无法解决幻读问题。即当某个事务在读取范围内的记录时,另外一个事务又在该范围内插入了新纪录,导致之前的事务再次读取时,产生幻行。
    4. SERIALIZABLE(可串行化)
    最高的隔离级别,通过加锁确保数据的一致性。

    看到这里的时候很容易产生一个困惑,可重复读和幻读怎么感觉没区别,实际上区别是:
    1.可重复读是指一个事务查询了数据,另一个事务提交了对这个数据的修改,于是再次读取数据的时候就出现了重复读的问题。例如,一个编辑人员两次读取同一文档,但在两次读取之间,作者重写了该文档。
    2.幻读则是一个事务修改了数据表,另一个数据插入了一条新数据,导致出现幻行。例如,一个编辑人员更改作者提交的文档,但当生产部门将其更改内容合并到该文档的主复本时,发现作者已将未编辑的新材料添加到该文档中。

    六、死锁
    1. 多个事务不同顺序锁定资源时,会产生死锁,
    2. 多个事务同时锁定同一个资源,产生死锁。
    InnoDB目前处理死锁的方法是,将持有最小行级排他锁的事务进行回滚(相对比较简单的死锁回滚方法)
    越复杂的系统,越能检测到死锁的循环依赖,并立即返回一个错误,否则会导致出现非常慢的查询。

    七、MySQL中的事务
    MySQL 提供了两种事务型的存储引擎:InnoDB 和 NDB Cluster
    MySQL默认采用自动提交模式,即每个查询都被当做一个事务执行提交操作。另外有一些命令在执行之前会强制执行commit提交,比如ALTER TABLE。

    MySQL服务层不管理事务,事务是由下层的存储引擎实现的,所以同一个事务中,使用多种存储引擎是不可靠的。

    InnoDB采用的是两阶段锁定协议,事务执行过程中,随时可以锁定,锁只有在执行commit或者rollback的时候才会释放,并且同一个时刻被释放。

    八、多版本并发控制MVCC
    MySQL的大多数事务型存储引擎都不是简单的行级锁。各大数据库基本都采用MVCC,但不尽相同。

    InnoDB的简化版:(MVCC实现原理)
    在每行记录后面保存两个隐藏的列来实现,一个保存了行的创建版本号,一个保存行的过期版本号(删除版本号)。

    版本号:
    1. 系统版本号:每开始一个新的事务,系统版本号就会自动增加
    2. 事务版本号:事务开始时刻的系统版本号

    当执行select操作时候:
    1. 只查找版本早于当前事务版本的数据行。 确保事务读取的行,在事务开始之前就存在的,或者是事务自身插入或者修改过的。
    2. 行的删除版本号要么未定义,要么大于当前事务版本号。 确保事务查询到的行,在事务开始之前没被删除。

    insert操作:
    为新插入的每一行保存当前系统版本号为行创建版本号。

    delete操作:
    为删除的行保存当前系统版本号作为行删除版本号。

    update操作:
    为插入一行新数据保存当前版本号作为该新行行创建版本号,同时保存当前系统版本号到原来的行作为行删除版本号。

    可见update = delete+insert

    采用MVCC这个原理,大多操作可以不用加锁,使得读数据操作简单,性能好,缺点是额外的存储空间消耗,更多的行检查和维护工作。MVCC只能在REPEATABLE READ 和READ COMMITTED两个隔离级别下工作。其他两个隔离级别跟MVCC不兼容。

    展开全文
  • 数据库的基本概念总结 1. 数据库定义:数据库是长期储存在计算机内、有组织的、可共享的大量数据的集合。数据库中的数据按一定的数据模型组织、描述和储存,具有较小的冗余度、较高的数据独立性和易扩展性...

    数据库的基本概念总结
    1. 数据库定义:数据库是长期储存在计算机内、有组织的、可共享的大量数据的集合。数据库中的数据按一定的数据模型组织、描述和储存,具有较小的冗余度、较高的数据独立性和易扩展性,并可为各种用户共享。
    2. 数据库管理技术发展的三个阶段:人工管理阶段,文件系统阶段,数据库系统阶段。
    3. DBMS(数据库管理系统)是位于用户与操作系统之间的一层数据管理软件。主要功能:1,数据定义功能。2,数据组织、存储和管理。3,数据操纵功能。4,数据库的事务管理和运行管理。5,数据库的建立和维护功能。6,其他功能。
    4. 什么是数据模型及其要素? (设计题): 数据模型是数据库中用来对现实世界进行抽象的工具,是数据库中用于提供信息表示和操作手段的形式构架。一般地讲,数据模型是严格定义的概念的集合。这些概 念精确地描述系统的静态特性、动态特性和完整性约束条件。因此数据模型通常由数据结构、数据操作和完整性约束三部分组成。 (1)数据结构:是所研究的对象类型的集合,是对系统的静态特性的描述。 (2)数据操作:是指对数据库中各种对象(型)的实例(值)允许进行的操作的集合,包括操作及有关的操作规则,是对系统动态特性的描述。 (3)数据的约束条件:是完整性规则的集合,完整性规则是给定的数据模型中数据及其联系所具有的制约和依存规则,用以限定符合数据模型的数据库状态以及状态的变化,以保证数据的正确、有效、相容。
    最常用的数据模型:层次模型,网状模型,关系模型,面积对象模型,对象关系模型。
    5.常用的数据模型有哪些(逻辑模型是主要的),各有什么特征,数据结构是什么样的。
    答:数据模型可分为两类:
    第一类是概念模型,也称信息模型,它是按用户的观点来地数据和信息建模,主要用于数据库设计。
    第二类是逻辑模型和物理模型。
    其中逻辑模型主要包括层次模型、层次模型、关系模型、面向对象模型和对象关系模型等。它是按计算机系统的观点对数据建模,主要用于DBMS的实现。
    物理模型是对数据最低层的抽象,它描述数据在系统内部的表示方式和存取方法,在磁盘或磁带上的存储方式和存取方法,是面向计算机系统的。物理模型是具体实现是DBMS的任务,数据库设计人员要了解和选择物理醋,一般用户则不必考虑物理级的细节。
    层次数据模型的数据结构特点:一是:有且只有一个结点没有双亲结点,这个结点称为根结点。二是:根 以外的其他结点有且只有一个双亲结点。优点是:1.层次 数据结构比较简单清晰。2.层次数据库的查询效率高。3.层次数据模型提供了良好的完整性支持。缺点主要有:1.现实世界中很多联系是非层次性的,如结点之间具有多对多联系。2.一个结点具有多个双亲等 ,层次模型表示这类联系的方法很笨拙,只能通过引入冗余数据或创建非自然的数据结构来解决。对插入和删除操作的限制比较多,因此应用程序的编写比较复杂。3.查询子女结点必须通过双亲结点。4.由于结构严密,层次命令趋于程序化。可见用层次模型对具有一对多的层次联系的部门描述非常自然,直观容易理解,这是层次数据库的突出优点。
    网状模型:特点:1.允许一个以上的结点无双亲2.一个结点可以有多于一个的双亲。网状数据模型的优点主要有:1.能够更为直接地描述现实世界,如一个结点可以有多个双亲。结点
    之间可以有多种上联第。2.具有良好的性能,存取效率较高。缺点主要有:1.结构比较复杂,而且随着应用环境的扩大,数据库的结构就变得越来越复杂,不利于最终 用户掌握。2.网状模型的DDL,DML复杂,并且要嵌入某一种高级语言中,用户不容易掌握,不容易使用。
    关系数据模型具有下列优点:1.关系模型与非关系模型不同,它是建立在严格的数学概念的基础上的。2.关系模型的概念单一。。3.关系模型的存取路径对用户透明,从而具有更高的数据独立性,更好的安全保密性,也简化了程序员的工作和数据库开发的建立 的工作。。主要的缺点是:由于存取路径房租明,查询效率往往不如非关系数据模型。因此为了提高性能,DBMS必须对用户的查询请求进行优化。因此增加 了开发DBMS的难度,不过用户不必考虑这些系统内部的优化技术细节。
    6.三级体系结构,外模式,模式 ,内模式定义是什么?
    模式也称逻辑模式,是数据库中全体数据的逻辑结构和牲的描述,是所有用户的公共数据视图。 外模式也称子模式或用户模式,它是数据库用户能够看见和使用的局部数据的逻辑结构和特征的描述,是数据库用户的数据视图是与某一应用有关的数据的逻辑表示。 内模式也称存储模式 ,是一个数据库只有一个内模式。它是数据物理结构和存储方式的描述,是数据在数据库内部的表示方式。
    7.两级映像和两级独立性,为什么叫物理独立性和逻辑独立性。
    当模式改变时由数据库管理员对各个外模式、模式的映像亻相应改变,可以使外模式保持不变。应用程序是依据数据的外模式编写的,从而应用程序不必修改,保证了数据与程序的逻辑独立生,简称数据的逻辑独立性。
    当数据库的存储结构改变了,由数据库管理员对模式、内模式映像作 相应改变,可以使模式保持不变,从而应用程序也不必改变。保证了数据与程序的物理独立性,简称数据的物理独立性。
    8.数据库系统一般由数据库、数据库管理系统 (及其开发工具)、应用系统和数据库管理员构成。
    9.关系的完整性(实体完整性、参照完整性、和用户定义的完整性)三部分内容,其中前二者是系统自动支持的,DBMS完整性控制子系统的三个主要功能?:提供定义完整性约束条件的机制,提供完整性检查的方法,违约处理。
    16.SQL的定义;即结构化查询语言,是关系数据库的标准语言,是一个通用的、功能极强的关系数据库语言。分类(交互式和嵌入式)17.group by 和having子句的作用
    20.视图的概念:视图是从一个或几个基本表导出的表。及相关操作:定义视图,查询视图,更新视图。视图更新有什么操作:插入,删除,和修改。
    22.数据库规范化的方法函数依赖的定义什么叫1NF2NF3NF BCNF定义:关系数据库中的关系是要满足一定要求的,满足不同程度要求的为不同范式。满足最低要求的叫第一范式,简称1NF。在第一范式中满足进一步要求的为第二范式,其余以此类推。各种范式之间的联系有:5NF(4NF(BCNF(3NF(2NF(1NF。
    25.数据库设计的几个阶段,每个阶段常用的方法和简要的内容:六个阶段:需求分析、概念结构设计、罗织结构设计、物理设计、数据库实施、数据库运行和维护。
    28.事务的概念?事务有哪些基本属性commit roll back含义:事务:是用户定义的一个数据库操作序列,这些操作要么全做,要么全不做,是一个不可分割的单位。四个特性:原子性,一致性,隔离性,持续性。Commit(提交:提交事务的所有操作) rollback(回滚:在事务运行的过程中发生了某种故障,事务不能继续执行,系统将事务中对数据库的所有已完成的操作全部撤销,回滚到事务开始时的状态。
    29.什么叫数据库系统的可恢复性?:数据库管理系统具有把数据库从错误状态恢复到某一已知的正确状态的功能,这就是数据库系统的可恢复性。数据库故障的种类:事务内部的故障,系统故障(软故障),介质故障(硬故障),计算机病毒。
    30.不进行并发控制可能产生的问题?:多个事务对数据库并发操作可能造成事务ACID特点遭到在破坏。如何解决(三个):1,丢失修改 2,不可重复读 3,读“脏”数据。
    31.三级封锁协议?能解决什么问题?:一级封锁协议:事务T在修改数据R之前必须先对其加X锁,直到事务结束才释放。事务结束包括正常结束(COMMIT)和非正常结束(ROLLBACK)。一级封锁协议中,如果是读数据不修改,是不需要加锁的,可防止丢失修改。二级封锁协议:在一级封锁协议基础上,加上事务T在读数据R之前必须先对其加上S锁,读完后即可释放S锁。在二级封锁协议中,由于读完数据后即可释放S锁,所以它不能保证可重复读。三级封锁协议:一级封锁协议加上事务T在读取数据R之前必须先对其加S锁,直到事务结束才释放。三级封锁协议除了防止了丢失修改和不读“脏”数据外,还进一步防止了不可重复读。
    上述三级协议的主要区别在于:什么操作需要申请封锁,以及何时释放锁。
    一般采取哪三种措施?插入呢?删除呢?:1,拒绝执行(不允许该操作执行),2,级连操作(当删除或修改被参照表的一个元组造成了与参照表的不一致,则删除或修改参照表中的所有造成不一致的元组),3,设置为空值(当删除或修改被参照表的一个元组时造成了不一致,则将参照表中的所有不造成不一致的元组的对应属性设置为空值)。
    38.视图对数据库安全性的作用?:1,视图能够简化用户的操作,2,视力使用户能以多种角度看待同一数据,3,视图对重构数据库提供了一定程度的逻辑独立性,4,视图能够对机密数据提供安全保护,5,适当的利用视图可以更清晰的表达查询。
    数据库:储存在计算机内,永久存储、有组织、有共享的大量数据的集合。
    数据管理技术的发展阶段:1.人工管理阶段:数据不保存,应用程序管理数据,数据不共享,数据不具有独立性。2.文件系统阶段:数据可以长期保存,由文件系统管理数据;数据共享性太差,冗余度大,数据独立性差。3.数据库系统阶段:出现数据库管理系统。
    数据库系统的特点:数据结构化(本质区别);数据共享性高、冗余度低、易扩充;数据独立性高;数据有DBMS统一管理和控制。
    数据库管理系统:1.定义:DBMS,是位于用户与操作系统之间的一层数据管理软件。2.功能:数据定义功能;数据组织、存储和管理;数据操纵功能;数据库的事务管理和运行管理;数据库的建立和维护功能;通信功能、数据转换功能、互访和互操作功能。
    数据库系统:1.概念:DBS,是指在计算机系统中引入数据库后的系统。2.组成:一般由数据库、数据库管理系统、应用系统、数据库管理员构成。3.分类:集中式,C/S式,并行式,分布式。
    数据模型:1.定义:现实世界数据特征的抽象。2.组成,三要素:数据结构、数据操作、数据的完整性约束。两类数据模型为1)概念模型2)逻辑模型和物理模型。
    数据结构:描述数据库的组成对象以及对象之间的联系,主要描述与对象的类型、内容、性质有关的对象和与数据之间联系有关的对象。
    常用的数据模型:1.层次模型,用树形结构表示各类实体以及实体间的联系。2.网状模型,允许一个以上的结点无双亲,允许一个结点可以有多于一个的双亲。3.关系模型,包含单一数据结构


    数据库的并发控制技术

    数据库是一个共享资源,可以供许多用户使用。各个用户程序(通常为一个事务)可以一个一个地串行执行,即每个时刻只有一个用户程序运行,执行数据库的存取操作,其它用户程序必须等到这个用户程序结束后方能对数据库存取。但是,由于用户程序在执行过程中随着时间的不同需要不同的资源,有时需要CPU,有时需要访问磁盘,有时需要I/O,有时需要通讯等,如果只让一个用户程序运行,而其它用户闲置等待,则导致许多系统资源在大部分时间内处于闲置状态。 因此,为了充分利用系统资源,发挥数据库共享资源的特点,应该允许各个用户并行地存取数据。但这样就会产生多个用户程序并发存取同一数据的情况。若对并发操作不加控制就可能导致存取和存储不正确的数据,从而破坏数据库的一致性。
    所以DBMS必须提供并发控制机制,且并发控制机制的好坏是衡量一个DBMS性能的重要指标之一。

    一.事务及其特性
    DBMS的并发控制是以事务(transaction)为单位进行的,因此,本节先介绍事务的概念及其特性。
    在多用户环境中用户程序不断访问数据库中的数据,构成了若干操作序列,在这些操作序列中,有些操作必须作为一个整体来执行,这些作为一个整体来执行的操作序列称为一个事务(Transaction)。即事务是用户定义的一组操作序列的集合,是数据恢复和并发控制的基本单位。数据库系统在执行事务时,要么执行事务中全部操作,要么一个操作都不执行。一个应用程序往往由若干个独立的事务组成。在应用程序中,事务的开始与结束可以由用户显示地控制。如果用户没有显示地定义事务,则由DBMS自动地按照缺省方式划分事务。在SQL中,用户显示定义事务的语句有如下3条:
    1、BEGIN TRANSACTION,该语句显示地定义一个事务的开始。
    2、COMMIT,该语句显示地提交一个事务,并表示该事务已正常结束。
    3、ROLLBACK,该语句显示地回滚一个事务,且表示事务因执行失败而结束。
    所谓提交事务,就是将该事务对数据库的所有更新操作结果永久地保存到磁盘上的物理数据库中去。
    所谓回滚事务,就是撤消该事务对数据库的所有更新操作,使数据库恢复到该事务开始时的状态。
    由以上可知,用户若要显示地定义事务,必须以BEGIN TRANSATION开始,而以COMMIT 或 ROLLBACK结束。
    事务具有四个特性,即原子性、一致性、隔离性和持续性,又常简称为ACID特性:
    1、原子性 :即一个事务是不可分割的数据库逻辑工作单位。
    2、一致性 :事务的执行结果必须使数据库从一个一致性状态变到另一个一致性状态。
    3、隔离性 :一个事务的执行不能被其它事务干扰。
    4、持续性 :持续性也称为永久性,指一个事务一旦提交,它对数据库中数据的改变应该是永久性的,其它操作或故障不对其产生任何影响。

    二.数据库的并发控制
    DBMS的并发控制是以事务为单位进行的。数据库在执行事务时,要么执行事务中的全部操作,要么一个操作都不执行。
    当有多个事务对数据库进行操作时,如果对数据库进行操作的各个事务按顺序执行,即一个事务执行完全结束后,另一个事务才开始,则称这种执行方式为串行访问(Serial access)。
    如果DBMS可以同时接纳多个事务,事务可以在时间上重叠执行,则称这种执行方式为并发访问(Concurrent access)。
    在单CPU系统中,同一时间只能有一个事务占用CPU,若各个事务交叉使用CPU,则称这种并发方式为交叉并发。
    在多CPU系统中,可以允许多个事务同时占用CPU,这种并发方式称为同时并发。

    三.并发的目的
    在数据库管理系统中对事务采用并发机制的主要目的有两个:
    1、改善系统的资源利用率
    对于一个事务来讲,在不同的执行阶段需要的资源不同,有时需要CPU,有时需要访问磁盘,有时需要I/O、有时需要通信如果事务串行执行,有些资源可能会空闲;如果事务并发执行,则可以交叉利用这些资源,有利于提高系统资源的利用率
    2、改善短事务的响应时间
    设有两个事务T1 和T2,其中T1是长事务,交付系统在先;T2是短事务,交付系统比T1稍后。如果串行执行,则须等T1执行完毕后才能执行T2。而T2的响应时间会很长。一个长事务的响应时间长一些还可以得到用户的理解,而一个短事务的响应时间过长,用户一般难以接受。
    如果T1 和T2并发执行,则T2可以和T1重叠执行,可以较快地结束,明显地改善其响应时间。

    四.并发所引起的问题
    数据库中的数据是共享的,即多个用户可以同时使用数据库中的数据,这就是并发操作。
    但是当多个用户存取同一组数据时,由于相互的干扰和影响,并发操作可能引发错误的结果,从而导致数据的不一致性问题我们将用下面的例子予以说明。
    例5.5 设有一个飞机机票订票系统,考虑如下售票活动的并发操作问题:
    1、售票员A通过网络在数据库中读出某航班的机票余额为y张,设y=15;
    2、售票员B通过网络在数据库中读出某航班的机票余额为y张,设y=15;
    3、售票员A卖出一张机票,然后修改余额为y=y?1,此时,y=14,将14写会数据库;
    4、售票员B卖出一张机票,然后修改余额为y=y?1,此时,y=14,将14写会数据库;
    这个售票活动并发操作的结果是:实际已经卖出2张机票,但在数据库中机票余额仅减少1,从而导致错误。这就是著名的飞机机票订票系统问题。
    这个问题之所以会产生错误,其根本原因在于两个用户反复交叉地使用同一个数据库的结果。
    如果事务不加控制地并发执行,会产生以下几个问题:
    1、丢失修改(Lost update)
    2、脏读(Dirty read)。
    3、不能重读(Unrepeatable read)

    五.并发控制方法
    实现现数据库并发控制的方法有多种,常用的有封锁技术、时标技术和版本更新技术等,而封锁技术在商品化数据库管理系统中使用得最为普遍。
    本节中介绍:
    (1)封锁技术
    (2)时标技术

    1.封锁技术
    封锁的定义
    锁是为了防止其它事务访问指定资源的一种手段。封锁(locking)是实现并发控制的一个非常重要的技术。
    所谓封锁即是在一段时间内禁止某些用户对数据对象做某些操作,以避免产生数据的不一致性问题。即事务T在对某个数据对象,如表、元组等进行操作之前,先向系统发出请求,并对其加锁。加锁成功后,事务T就对数据对象有了一定的控制权,在事务T释放它的锁之前,其它的事务就不能更新此数据对象。
    封锁的类型
    基本的封锁一般有排它锁和共享锁两种类型。
    (1)排它锁:又称X锁,如果某事务T对某数据建立了排它锁,则该事务能对该数据对象进行读、修改、插入和删除等操作,而其它事务则不能。
    (2)共享锁:又称S锁,如果某事务对某数据建立了共享锁,则此时该事务能对该数据对象进行读操作,但不能进行修改等更新操作;而其它事务只能对该数据对象加S锁,而不能加X锁,即其它事务只能对该数据对象进行读操作。

    封锁粒度
    所谓封锁的粒度,即是被封锁数据对象的大小。在关系数据库中,封锁的粒度有如下几种:属性值、属性值集、元组、关系、索引项、整个索引或整个数据库。还可以是一些物理单元:页(数据页或索引页)、块等等。
    封锁的粒度与系统的并发度和并发控制的开销密切相关。封锁粒度越大,系统中能够被封锁的对象就越少,并发度也就越小,但同时系统开销也越少;封锁粒度越小,并发度越高,但系统开销也就越大。因此,如果在一个系统中能同时存在不同大小的封锁粒度对象供不同的事务选择使用,是比较理想的。

    封锁协议
    封锁的目的是为了保证能够正确地调度和控制并发操作。为此,在运用X锁和S锁这两种基本锁对一定粒度的数据对象加锁时,还需约定一些规则。
    例如,一个事务何时该申请X锁或S锁、事务持锁时间的长短如何控制、何时释放所获得的锁等等。我们称这些规则为封锁协议 (Locking protocol)。
    下面介绍三级封锁协议:
    1、一级封锁协议:某事务T若要修改某个数据对象,则必须先对该数据对象加X锁,直到事务结束才释放。此种封锁协议可防止“丢失修改”所产生的数据不一致性问题。
    2、二级封锁协议:一级封锁协议加上某事务T若要读取某个数据对象之前,则必须先对该数据对象加S锁,读完后即可释放S锁,这样可进一步防止“读脏数据”的问题。
    3、三级封锁协议:一级封锁协议加上某事务T若要读取某个数据对象之前,则必须先对该数据对象加S锁,且知道该事务结束后才可释放S锁,这样可进一步防止数据“不可重复读”的问题。

    死锁和活锁
    活锁:如果事务T1封锁了数据对象R后,事务T2也请求封锁R,于是T2等待。接着T3也请求封锁R。当T1释放了加在R上的锁后,系统首先批准了T3的请求,T2只得继续等待。接着T4也请求封锁R,T3释放R上的锁后,系统又批准了T4的请求,……,因此,事务T2就有可能这样永远地等待下去。以上这种情况就称为活锁。
    避免活锁的简单办法是采用先来先服务的策略。当多个事务请求封锁同一数据对象时,封锁子系统按封锁请求的先后次序对这些事务排队,该数据对象上的锁一旦释放,首先批准申请队列中的第一个事务获得锁。

    死锁:如果事务T1封锁了数据对象A,T2封锁了数据对象B之后,T1又申请封锁数据对象B,且T2又申请封锁数据对象A。因T2已封锁了B,于是T1等待T2释放加在B上的锁。因T1已封锁了A,T2也只能等待T1释放加在A上的锁。这样就形成了T1在等待T2结束,而T2又在等待T1结束的局面。T1和T2这两个事务永远不能结束,这就是死锁问题。
    死锁的另一情况是数据库系统有若干个长时间运行的事务在执行并行的操作,当查询分析器处理一种非常复杂的连接查询时,由于不能控制处理的顺序,有可能发生死锁现象。
    目前,解决死锁问题的方法主要有两类:
    预防法:
    此类方法中常用的又有:
    (1)一次封锁法
    (2)顺序封锁法
    诊断解除法

    2.时标技术
    (1).时标的定义
    (2).时标的原理
    (3).基于时标技术的并发控制方法所采用的协议
    (4).基于时标技术的并发调度实例
    (5).时标技术与封锁技术的基本区别
    (6).时标技术的优缺点

    数据库 并发调度技术 四种问题 三级封锁协议

    数据库是一个共享资源,可以提供多个用户使用。这些用户程序可以一个一个地串行执行,每个时刻只有一个用户程序运行,执行对数据库的存取,其他用户程序必须等到这个用户程序结束以后方能对数据库存取。但是如果一个用户程序涉及大量数据的输入/输出交换,则数据库系统的大部分时间处于闲置状态。因此,为了充分利用数据库资源,发挥数据库共享资源的特点,应该允许多个用户并行地存取数据库。但这样就会产生多个用户程序并发存取同一数据的情况,若对并发操作不加控制就可能会存取和存储不正确的数据,破坏数据库的一致性,所以数据库管理系统必须提供并发控制机制。并发控制机制的好坏是衡量一个数据库管理系统性能的重要标志之一。

    DM用封锁机制来解决并发问题。它可以保证任何时候都可以有多个正在运行的用户程序,但是所有用户程序都在彼此完全隔离的环境中运行。

    一、 并发控制的预备知识

    (一) 并发控制概述

    并发控制是以事务(transaction)为单位进行的。

    1. 并发控制的单位――事务

    事务是数据库的逻辑工作单位,它是用户定义的一组操作序列。一个事务可以是一组SQL语句、一条SQL语句或整个程序。

    事务的开始和结束都可以由用户显示的控制,如果用户没有显式地定义事务,则由数据库系统按缺省规定自动划分事务。

    事务应该具有4种属性:原子性、一致性、隔离性和持久性。

    (1)原子性

    事务的原子性保证事务包含的一组更新操作是原子不可分的,也就是说这些操作是一个整体,对数据库而言全做或者全不做,不能部分的完成。这一性质即使在系统崩溃之后仍能得到保证,在系统崩溃之后将进行数据库恢复,用来恢复和撤销系统崩溃处于活动状态的事务对数据库的影响,从而保证事务的原子性。系统对磁盘上的任何实际数据的修改之前都会将修改操作信息本身的信息记录到磁盘上。当发生崩溃时,系统能根据这些操作记录当时该事务处于何种状态,以此确定是撤销该事务所做出的所有修改操作,还是将修改的操作重新执行。

    (2)一致性

    一致性要求事务执行完成后,将数据库从一个一致状态转变到另一个一致状态。它是一种以一致性规则为基础的逻辑属性,例如在转账的操作中,各账户金额必须平衡,这一条规则对于程序员而言是一个强制的规定,由此可见,一致性与原子性是密切相关的。事务的一致性属性要求事务在并发执行的情况下事务的一致性仍然满足。它在逻辑上不是独立的,它由事务的隔离性来表示。

    (3) 隔离性

    隔离性意味着一个事务的执行不能被其他事务干扰。即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰。它要求即使有多个事务并发执行,看上去每个成功事务按串行调度执行一样。这一性质的另一种称法为可串行性,也就是说系统允许的任何交错操作调度等价于一个串行调度。串行调度的意思是每次调度一个事务,在一个事务的所有操作没有结束之前,另外的事务操作不能开始。由于性能原因,我们需要进行交错操作的调度,但我们也希望这些交错操作的调度的效果和某一个串行调度是一致的。 DM实现该机制是通过对事务的数据访问对象加适当的锁,从而排斥其他的事务对同一数据库对象的并发操作。

    (4)持久性

    系统提供的持久性保证要求一旦事务提交,那么对数据库所做的修改将是持久的,无论发生何种机器和系统故障都不应该对其有任何影响。例如,自动柜员机( ATM)在向客户支付一笔钱时,就不用担心丢失客户的取款记录。事务的持久性保证事务对数据库的影响是持久的,即使系统崩溃。正如在讲原子性时所提到的那样,系统通过做记录来提供这一保证。

    DM没有提供显式定义事务开始的语句,第一个可执行的SQL语句(除CONNECT语句外)隐含事务的开始,但事务的结束可以由用户显式的控制。在DM中以下几种情况都结束 (正常,非正常)某一事务:

    (1)当某一连接的属性设置为自动提交,每执行一条语句都会提交;

    (2)遇到COMMIT/ROLLBACK语句,便提交/回滚一事务;

    (3)当系统的 DDL自动提交开关打开时(缺省为打开),遇到DDL语句则自动提交该DDL语句和以前的DML和DDL操作;

    (4)事务所在的程序正常结束和用户退出;

    (5)系统非正常终止时;

    说明:DM在配置文件中提供了DDL语句的自动提交开关DDL_AUTO_COMMIT。 当此配置项的值为 1(缺省情况)时,所有DDL语句自动提交;当此配置项的值为0时,除CREATEDATABASE、ALTERDATABASE和CREATESCHEMA语句外的所有DDL语句都不自动提交。

    DM中的一致性是以事务为基础的。DM通过提交和回滚分别用于将对数据库的修改永久化和废除,但是无论是提交和回滚,DM保证数据库在每个事务开始前、结束后是一致的。为了提高事务管理的灵活性,DM提供了设置保存点(SAVEPOINT)语句和回滚到保存点语句。保存点提供了一种灵活的回滚,事务在执行中可以回滚到某个保存点,在该保存点以前的操作有效,而以后的操作被回滚掉。

    DM中的事务同样具有上述4个属性:原子性、一致性、隔离性和持久性。

    2. 并发操作与数据的不一致性

    如果没有锁定且多个用户同时访问一个数据库,则当他们的事务同时使用相同的数据时可能会发生问题,导致数据库中的数据的不一致性。

    一个最常见的并发操作的例子是火车/飞机订票系统中的订票操作。例如,在该系统中的一个活动序列:

    ① 甲售票员读出某航班的机票张数余额A,设A=16;

    ② 乙售票员读出同一航班的机票张数余额A,也是16;

    ③ 甲售票员卖出一张机票,修改机票张数余额A=A-1=15,把A写回数据库;

    ④ 乙售票员也卖出一张机票,修改机票张数余额A=A-1=15,把A写回数据库。

    结果明明卖出两张机票,数据库中机票余额只减少1。

    这种情况称为数据库的不一致性。这种不一致性是由甲、乙两个售票员并发操作引起的。在并发操作情况下,对甲、乙两个事务操作序列的调度是随机的。若按上面的调度序列行,甲事务的修改就被丢失。这是由于第4步中乙事务修改A并写回覆盖了甲事务的修改。

    并发操作带来的数据库不一致性可以分为四类:丢失或覆盖更新、脏读、不可重复读和幻像读,上例只是并发问题的一种。

    (1) 丢失或覆盖更新(lost update)

    当两个或多个事务选择同一数据,并且基于最初选定的值更新该数据时,会发生丢失更新问题。每个事务都不知道其它事务的存在。最后的更新将重写由其它事务所做的更新,这将导致数据丢失。上面预定飞机票的例子就属于这种并发问题。事务1与事务2先后读入同一数据A=16,事务1执行A-1,并将结果A=15写回,事务2执行A-1,并将结果A=15写回。事务2提交的结果覆盖了事务1对数据库的修改,从而使事务1对数据库的修改丢失了。




    (2) 脏读
    一个事务读取了另一个未提交的并行事务写的数据。当第二个事务选择其它事务正在更新的行时,会发生未确认的相关性问题。第二个事务正在读取的数据还没有确认并且可能由更新此行的事务所更改。换句话说,当事务1修改某一数据,并将其写回磁盘,事务2读取同一数据后,事务1由于某种原因被撤销,这时事务1已修改过的数据恢复原值,事务2读到的数据就与数据库中的数据不一致,是不正确的数据,称为脏读。
    例如,在下图中,事务1将C值修改为200,事务2读到C为200,而事务1由于某种原因撤销,其修改作废,C恢复原值100,这时事务2读到的就是不正确的“脏“数据了。



    (3) 不可重复读(nonrepeatable read)
    一个事务重新读取前面读取过的数据,发现该数据已经被另一个已提交的事务修改过。即事务1读取某一数据后,事务2对其做了修改,当事务1再次读数据时,得到的与第一次不同的值。
    例如,在下图中,事务1读取B=100进行运算,事务2读取同一数据B,对其进行修改后将B=200写回数据库。事务1为了对读取值校对重读B,B已为200,与第一次读取值不一致。



    (4) 幻像读
    如果一个事务在提交查询结果之前,另一个事务可以更改该结果,就会发生这种情况。这句话也可以这样解释,事务1按一定条件从数据库中读取某些数据记录后未提交查询结果,事务2删除了其中部分记录,事务1再次按相同条件读取数据时,发现某些记录神秘地消失了;或者事务1按一定条件从数据库中读取某些数据记录后未提交查询结果,事务2插入了一些记录,当事务1再次按相同条件读取数据时,发现多了一些记录。
    产生上述四类数据不一致性的主要原因是并发操作破坏了事务的隔离性。并发控制就是要用正确的方式调度并发操作,使一个用户事务的执行不受其他事务的干扰,从而避免造成数据的不一致性。
    3. 并发场景列举
    结合SQL语句,列举各种并发情况(包括可能导致数据不一致性和对数据一致性不产生影响的情况)。A表示某一条数据,b和c都表示满足某一个标准的两条或多条数据,^表示“非”的意思,∈表示属于或包含于的意思,1表示第一个事务,2表示第二个事务。



    (二) 并发操作的调度
    计算机系统对并行事务中并行操作的调度是随机的,而不同的调度可能会产生不同的结果,那么哪个结果是正确的,哪个是不正确的呢?
    如果一个事务运行过程中没有其他事务在同时运行,也就是说没有受到其他事务的干扰,那么就可能认为该事务的运行结果是正常的或者预想的,因此将所有事务串行起来的调度策略是正确的调度策略。虽然以不同的顺序串行执行事务也可能会产生不同的结果,但由于不会将数据库置于不一致状态,所以都可以认为是正确的。由此可以得到如下结论:几个事务的并行执行是正确的,当且仅当其结果与按某一次序串行地执行它们的结果相同。我们称这种并行调度策略为可串行化(serializable)的调度。可串行性(serializability)是并行事务正确性的唯一准则。
    例如,现在有两个事务,分别包含下列操作:
    事务1:读B;A=B+1;写回A;
    事务2:读A;B=A+1;写回B;
    假设A的初值为10,B的初值为2。下图给出了对这两个事务的三种不同的调度策略,(a)和(b)为两种不同的串行调度策略,虽然执行结果不同,但他们都是正确的调度。(c)中两个事务是交错执行的,由于执行结果与(a)、(b)的结果都不同,所以是错误的调度。(d)中的两个事务也是交错执行的,由于执行结果与串行调度1(图(a))的执行结果相同,所以是正确的调度。



    为了保证并行操作的正确性,DBMS的并行控制机制必须提供一定的手段来保证调度是可串行化的。
    从理论上讲,在某一事务执行时禁止其他事务执行的调度策略一定是可串行化的调度,这也是最简单的调度策略,但这种方法实际上是不可行的,因为它使用户不能充分共享数据库资源。
    目前DBMS普遍采用封锁方法(悲观方法,DM采用的就是这种方法,SQL Server也是采用的这种方法)来保证调度的正确性;即保证并行操作调度的可串行性。除此之外还有其他一些方法,如时标方法、乐观方法等。

    • 悲观并发控制
    锁定系统阻止用户以影响其它用户的方式修改数据。如果用户执行的操作导致应用了某个锁,则直到这个锁的所有者释放该锁,其它用户才能执行与该锁冲突的操作。该方法主要用在数据争夺激烈的环境中,以及出现并发冲突时用锁保护数据的成本比回滚事务的成本低的环境中,因此称该方法为悲观并发控制。

    • 乐观并发控制
    在乐观并发控制中,用户读数据时不锁定数据。在执行更新时,系统进行检查,查看另一个用户读过数据后是否更改了数据。如果另一个用户更新了数据,将产生一个错误。一般情况下,接收错误信息的用户将回滚事务并重新开始。该方法主要用在数据争夺少的环境内,以及偶尔回滚事务的成本超过读数据时锁定数据的成本的环境内,因此称该方法为乐观并发控制。

    • 时标并发控制
    时标和封锁技术之间的基本区别是封锁是使一组事务的并发执行(即交叉执行)同步,使用它等价于这些事务的某一串行操作;时标法也是使用一组事务的交叉执行同步,但是使它等价于这些事务的一个特定的串行执行,即由时标的时序所确定的一个执行。如果发生冲突,是通过撤销并重新启动一个事务解决的。事务重新启动,则赋予新的时标。

    (三) 封锁
    封锁是事项并发控制的一个非常重要的技术。所谓封锁就是事务T在对某个数据对象,例如,在标、记录等操作之前,先向系统发出请求,对其加锁。加锁后事务T就对数据库对象有了一定的控制,在事务T释放它的锁之前,其他事务不能更新此数据对象。
    1. 封锁类型
    DBMS通常提供了多种数据类型的封锁。一个事务对某个数据对象加锁后究竟拥有什么样的控制是由封锁类型决定的。基本的封锁类型有两种:排他锁(exclusive lock,简记为X锁)和共享锁(share lock简记为S锁)
    排他锁又称为写锁。若事务T对数据对象A加上X锁,则只允许T读取和修改A,其他任何事务都不能再对A加任何类型的锁,直到T释放A上的锁。这就保证了其他事务在T释放A上的锁之前不能再读取和修改A。
    共享锁又称为读锁。若事务T对数据对象A加上S锁,则其他事务只能再对A加S锁,而不能加X锁,直到T释放A上的锁。这就保证了其他事务可以读A,但在T释放A上的S锁之前不能对A做任何修改。
    排他锁与共享锁的控制方式可以用下图的相容矩阵来表示。
    在下图的封锁类型相容矩阵中,最左边一列表示事务T1已经获得的数据对象上的锁的类型,其中横线表示没有加锁。最上面一行表示另一事务T2对同一数据对象发出的封锁请求。T2的封锁请求能否被满足用Y和N表示,其中Y表示事务T2的封锁要求与T1已持有的锁相容,封锁请求可以满足。N表示T2的封锁请求与T1已持有的锁冲突,T2请求被拒绝。



    2. 封锁粒度

    X锁和S锁都是加在某一个数据对象上的。封锁的对象可以是逻辑单元,也可以是物理单元。例如,在关系数据库中,封锁对象可以是属性值、属性值集合、元组、关系、索引项、整个索引、整个数据库等逻辑单元;也可以是页(数据页或索引页)、块等物理单元。封锁对象可以很大,比如对整个数据库加锁,也可以很小,比如只对某个属性值加锁。封锁对象的大小称为封锁的粒度(granularity)。

    封锁粒度与系统的并发度和并发控制的开销密切相关。封锁的粒度越大,系统中能够被封锁的对象就越小,并发度也就越小,但同时系统开销也越小;相反,封锁的粒度越小,并发度越高,但系统开销也就越大。
    因此,如果在一个系统中同时存在不同大小的封锁单元供不同的事务选择使用是比较理想的。而选择封锁粒度时必须同时考虑封锁机构和并发度两个因素,对系统开销与并发度进行权衡,以求得最优的效果。一般说来,需要处理大量元组的用户事务可以以关系为封锁单元;需要处理多个关系的大量元组的用户事务可以以数据库为封锁单位;而对于一个处理少量元组的用户事务,可以以元组为封锁单位以提高并发度。

    3. 封锁协议

    封锁的目的是为了保证能够正确地调度并发操作。为此,在运用X锁和S锁这两种基本封锁,对一定粒度的数据对象加锁时,还需要约定一些规则,例如,应何时申请X锁或S锁、持锁时间、何时释放等。我们称这些规则为封锁协议(locking protocol)。对封锁方式规定不同的规则,就形成了各种不同的封锁协议,它们分别在不同的程度上为并发操作的正确调度提供一定的保证。本节介绍保证数据一致性的三级封锁协议和保证并行调度可串行性的两段锁协议,下一节将介绍避免死锁的封锁协议。

    (5) 保证数据一致性的封锁协议――三级封锁协议

    对并发操作的不正确调度可能会带来四种数据不一致性:丢失或覆盖更新、脏读、不可重复读和幻想读。三级封锁协议分别在不同程度上解决了这一问题。

    ① 1级封锁协议

    1级封锁协议的内容是:事务T在修改数据R之前必须先对其加X锁,直到事务结束才释放。事务结束包括正常结束(commit)和非正常结束(rollback)。

    1级封锁协议可以防止丢失或覆盖更新,并保证事务T是可以恢复的。例如,下图使用1级封锁协议解决了定飞机票例子的丢失更新问题。



    上图中,事务1在读A进行修改之前先对A加X锁,当事务2再请求对A加X锁时被拒绝,只能等事务1释放A上的锁。事务1修改值A=15写回磁盘,释放A上的X锁后,事务2获得对A的X锁,这时他读到的A已经是事务1更新过的值15,再按此新的A值进行运算,并将结果值A=14回到磁盘。这样就避免了丢失事务1的更新。

    在1级封锁协议中,如果仅仅是读数据不对其进行修改,是不需要加锁的,所以它不能保证可重复读和脏读。

    ② 2级封锁协议

    2级封锁协议的内容是:1级封锁协议加上事务T在读取数据R之前必须先对其加S锁,读完后即可释放S锁。
    2级封锁协议除防止了丢失或覆盖更新,还可进一步防止脏读。例如,下图使用2级封锁协议解决了脏读的问题。
    |
    下图中,事务1在对C进行修改之前,先对C加X锁,修改其值后写回磁盘。这时事务2请求C加上S锁,因T1已在C上加了X锁,事务2只能等待事务1释放它。之后事务1因某种原因被撤销,C恢复为原值100,并释放C上的X锁。事务2获得C上的S锁,读C=100。这就避免了事务2脏读数据。

    在2级封锁协议中,由于读完数据后即可释放S锁,所以它不能保证可重复读。



    ③ 3级封锁协议

    3级封锁协议的内容是:1级封锁协议加上事务T在读取数据之前必须先对其加S锁,直到事务结束才释放。
    3级封锁协议除防止丢失或覆盖更新和不脏读数据外,还进一步防止了不可重复读和幻想读。例如下图,使用3级封锁协议解决了不可重复读和幻像读问题。



    上图中,事务1在读A,B之前,先对A,B加S锁,这样其他事务只能再对A,B加S锁,而不能加X锁,即其他事务只能读A,B,而不能修改它们。所以当事务2为修改B而申请对B的X锁时被拒绝,使其他无法执行修改操作,只能等待事务1释放B上的锁。接着事务1为验算再读A,B,这时读出的B仍是100,求和结果仍为150,即可重复读。

    上述三级协议的主要区别在于什么操作需要申请封锁以及何时释放锁(即持锁时间)。三级封锁协议可以总结为下表。



    (6) 保证并行调度可串行性的封锁协议――两段封锁协议

    可串行性是并行调度正确性的唯一准则,两段锁(two-phase locking,简称2PL)协议是为保证并行调度可串行性而提供的封锁协议。

    两段封锁协议规定:

    ①在对任何数据进行读、写操作之前,事务首先要获得对该数据的封锁,而且②在释放一个封锁之后,事务不再获得任何其他封锁。

    所谓“两段”锁的含义是,事务分为两个阶段,第一阶段是获得封锁,也称为扩展阶段,第二阶段是释放封锁,也称为收缩阶段。

    例如,事务1的封锁序列是:

    Slock A... Slock B… Xlock C… Unlock B… Unlock A… Unlock C;

    事务2的封锁序列是:

    Slock A... Unlock A… Slock B… Xlock C… Unlock C… Unlock B;

    则事务1遵守两段封锁协议,而事务2不遵守两段封锁协议。

    可以证明,若并行执行的所有事务均遵守两段锁协议,则对这些事务的所有并行调度策略都是可串行化的。因此我们得出如下结论:所有遵守两段锁协议的事务,其并行的结果一定是正确的。

    需要说明的是,事务遵守两段锁协议是可串行化调度的充分条件,而不是必要条件。即可串行化的调度中,不一定所有事务都必须符合两段封锁协议。例如,在下图中,(a)和(b)都是可串行化的调度,但(a)遵守两段锁协议,(b)不遵守两段锁协议。



    4. 死锁和活锁

    封锁技术可以有效地解决并行操作的一致性问题,但也带来一些新的问题,即死锁和活锁的问题。

    (1) 活锁

    如果事务T1封锁了数据对象R后,事务T2也请求封锁R,于是T2等待。接着T3也请求封锁R。T1释放R上的锁后,系统首先批准了T3的请求,T2只得继续等待。接着T4也请求封锁R,T3释放R上的锁后,系统又批准了T4的请求……,T2有可能就这样永远等待下去。这就是活锁的情形,如下图所示。



    避免活锁的简单方法是采用先来先服务的策略。当多个事务请求封锁同一数据对象时,封锁子系统按请求封锁的先后次序对这些事务排队,该数据对象上的锁一旦释放,首先批准申请队列中第一个事务获得锁。

    (2) 死锁

    如果事务T1封锁了数据A,事务T2封锁了数据B。之后T1又申请封锁数据B,因T2已封锁了B,于是T1等待T2释放B上的锁。接着T2又申请封锁A,因T1已封锁了A,T2也只能等待T1释放A上的锁。这样就出现了T1在等待T2,而T2又在等待T1的局面,T1和T2两个事务永远不能结束,形成死锁。如下图所示。



    死锁问题在操作系统和一般并行处理中已做了深入研究,但数据库系统有其自己的特点,操作系统中解决死锁的方法并不一定合适数据库系统。

    目前在数据库中解决死锁问题主要有两类方法,一类方法是采取一定措施来预防死锁的发生,另一类方法是允许发生死锁,采用一定手段定期诊断系统中有无死锁,若有则解除之。

    ① 死锁的预防
    在数据库系统中,产生死锁的原因是两个或多个事务都已封锁了一些数据对象,然后又都请求对已为其他事务封锁的数据对象加锁,从而出现死锁等待。防止死锁的发生其实就是要破坏产生死锁的条件。预防死锁通常有两种方法。

    ◆ 一次封锁法
    一次封锁法要求每个事务必须一次将所有要使用的数据全部加锁,否则就不能继续执行。例如,在上图的例子中,如果事务T1将数据对象A和B一次加锁,T1就可以执行下去,而T2等待。T1执行完后释放A,B上的锁,T2继续执行。这样就不会发生死锁。

    一次封锁法虽然可以有效地防止死锁的发生,但也存在问题。第一,一次就将以后要用到的全部数据加锁,势必扩大了封锁的范围,从而降低了系统的并发度。第二,数据库中数据是不断变化的,原来不要求封锁的数据,在执行过程中可能会变成封锁对象,所以很难实现精确地确定每个事务所要封锁的数据对象,只能采取扩大封锁范围,将事务在执行过程中可能要封锁的数据对象全部加锁,这就进一步降低了并发度。

    ◆ 顺序封锁法
    顺序封锁法是预先对数据对象规定一个封锁顺序,所有事务都按这个顺序执行封锁。在上例中,我们规定封锁顺是A,B,T1和T2都按此顺序封锁,即T2也必须先封锁A。当T2请求A的封锁时,由于T1已经封锁住A,T2就只能等待。T1释放A,B上的锁后,T2继续运行。这样就不会发生死锁。

    顺序封锁法同样可以有效地防止死锁,但也同样存在问题。第一,数据库系统中可封锁的数据对象及其众多,并且随数据的插入、删除等操作而不断地变化,要维护这样极多而且变化的资源的封锁顺序非常困难,成本很高。

    第二,事务的封锁请求可以随着事务的执行而动态地决定,很难事先确定每一个事务要封锁哪些对象,因此也就很难按规定的顺序取施加封锁。例如,规定数据对象的封锁顺序为A,B,C,D,E。事务T3起初要求封锁数据对象B,C,E,但当它封锁B,C后,才发现还需要封锁A,这样就破坏了封锁顺序。

    可见,在操作系统中广为采用的预防死锁的策略并不很适合数据库的特点,因此DBMS在解决死锁的问题上更普遍采用的是诊断并解除死锁的方法。
    ② 死锁的诊断与解除
    数据库系统中诊断死锁的方法与操作系统类似,即使用一个事务等待图,它动态地反映所有事务的等待状况。并发控制子系统周期性地(比如每隔1分钟)检测事务等待图,如果发现图中存在回路,则表示系统中出现了死锁。关于诊断死锁的详细讨论请参阅操作系统的有关书籍。
    DBMS的并发控制子系统一旦检测到系统中存在死锁,就要设法解除。通常采用的方法是选择一个处理死锁代价最小的事务,将其撤销,释放此事务持有的所有的锁,使其他事务能继续运行下去。
    二、 DM的并发控制
    (一) 事务隔离级
    事务的隔离级描述了给定事务的行为对其它并发执行事务的暴露程度。 SQL-92共规定了四种隔离级别,通过选择四个隔离级中的一个,用户能增加对其它未提交事务的暴露程度,获得更高的并发度。隔离级别是一个事务必须与其它事务进行隔离的程度。
    SQL-92的四种隔离级别如下所示,DM支持所有这些隔离级别:
    (1)脏读(READ UNCOMMITTED):事务隔离的最低级别,事务可能查询到其它事务未提交的数据, 仅可保证不读取物理损坏的数据)。
    (2)读提交(READ COMMITTED):DM默认级别,保证不读脏数据。
    (3)可重复读(REPEATABLE READ):保证不可重复读,但有可能读入幻像数据。
    (4)可串行化(SERIALIZABLE):事务隔离的最高级别,事务之间完全隔离。
    DM允许用户改变未启动的事务的隔离级和读写特性 ,而且设置的选项将一直对那个连接保持有效,直到显式更改该选项为止。设置事务隔离级别虽然使程序员承担了某些完整性问题所带来的风险,但可以换取对数据更大的并发访问权。与以前的隔离级别相比,每个隔离级别都提供了更大的隔离性,但这是通过在更长的时间内占用更多限制锁换来的。DM还提供设置事务只读属性的语句,使用该语句后该事务只能做查询操作,不能更新数据库。
    需要注意的是,事务的隔离级别并不影响事务查看本身对数据的修改,也就是说,事务总可以查看自己对数据的修改。事务的隔离级别需要根据实际需要设定,较低的隔离级别可以增加并发,但代价是降低数据的正确性。相反,较高的隔离级别可以确保数据的正确性,但可能对并发产生负面影响。应用程序要求的隔离级别确定了DM使用的锁定行为。
    下表中列出四种隔离级别允许不同类型的现象



    注意:丢失或覆盖更新在所有的标准SQL隔离级中都是禁止的。

    (二) 并发处理

    1. 数据锁定机制

    DM用数据锁定机制来解决并发问题。它可以保证任何时候都可以有多个正在运行的事务,但是所有事务都在彼此完全隔离的环境中运行。

    DM的封锁对象为表和元组。封锁的实施有自动和手动两种,即隐式上锁和显式上锁。隐式封锁动作的封锁根据事务的隔离级有所不同。同时, DM提供给用户4种手动上锁语句,用以适应用户定义的应用系统。

    一般而言, DM的隐式封锁足以保证数据的一致性,但用户可以根据自己的需要改变对表的封锁。 DM提供给用户四种表锁:意向共享锁(IS:INTENSIVE SHARE)、共享锁(S:SHARE)、意向排它锁(IX:INTENSIVE EXCLUSIVE)和排它锁(X:EXCLUSIVE)。例如,在读提交隔离级下,系统缺省的表锁是 IS或IX ,在这两种表锁下,在访问元组前还需对元组进行封锁,为了提高系统的效率,用户可以手动对表进行 X封锁,这样,就不需对访问元组封锁。

    封锁机制要达到以下目的:

    (1)一致性:保证用户正在查看时,改变的数据并未从根本上发生变化。

    (2)完整性:保证数据库的基本结构以正确的顺序,准确地反映对它们的所有改变。

    一个“ 锁定” 可以认为是当某一进程需要防止其它进程做某事时获得的某种东西,当该进程不再关心此事时就 “释放 ”此锁定,通常一个锁定是加在某个 “资源 ”(某些客体,如表 )上的。

    DM的内部锁定是自动完成的。当某一进程要查看一个客体但不允许其他人修改它时,就获得一个共享方式的锁定。当某一进程要修改一客体,并且防止任何其它进程修改它时,就获得更新方式的锁定。当某一进程要修改一客体,并且防止任何其它进程修改它或以共享方式封锁它时,就获得独占方式的锁定。

    2. 锁定类型

    DM中的锁有三种,表锁、行锁和键范围锁。

    ◆ 表锁
    表锁用来封锁表对象,在对表进行检索和更新时,DM会对表对象进行封锁,但是DM为用户提供手动的表锁语句,用户可以根据自己的需要改变对表的封锁类型。表锁的模式:意向共享锁 IS,意向排它锁 IX,共享锁 S,排它锁 X,共四种,其相容矩阵可定义如下表。



    ◆ 行锁
    行锁封锁元组,在存取元组和更新元组前, DM会对元组上行锁,系统不提供手动的行封锁语句。行锁有两种模式:共享锁(S)、排它锁(X),其相容矩阵定义如下表。



    ◆ 键范围锁
    键范围锁用在可串行事务上,主要解决了幻像读并发问题。键范围锁覆盖单个记录以及记录之间的范围,可以防止对事务访问的记录集进行幻像插入或删除。键范围锁仅用于在可串行隔离级别上操作的事务。
    可串行性要求,如果任意一个查询在一个事务中后面的某一时刻再次执行,其所获取的行集应与该查询在同一事务中以前执行时所获得的行集相同。如果本查询试图提取的行不存在,则在试图访问该行的事务完成之前,其它事务不能插入该行。如果允许另一个事务插入该行,则它将以幻像出现。
    如果另一个事务试图插入驻留在锁定数据页上的行,页级锁定可以防止添加幻像行,并维护可串行性。但是,如果该行要添加到未被第一个事务锁定的数据页,应设定锁定机制防止添加该行。
    键范围锁通过覆盖索引行和索引行之间的范围来工作(而不是锁定整个基础表的行)。因为第二个事务在该范围内进行任何行插入、更新或删除操作时均需要修改索引,而键范围锁覆盖了索引项,所以在第一个事务完成之前会阻塞第二个事务的进行。
    键范围锁由系统自行执行,执行的条件是: (1) 事务隔离级为可串行化级; (2) 查询结果通过某个索引得出。
    用户上锁成功后锁将一直有效,直到当前事务结束时,该锁被系统自动解除。

    3. 锁定类型比较



    4. SQL语句锁定分析
    DM对各种 DDL和GRANT 等非DML 语句都分解为增、删、改。下表为DM对各种DML语句和查询语句的封锁策略。

    表:SQL语句封锁策略


    注:S* 表示瞬时锁,在语句结束后释放;Range表示键范围锁。

    上表只是系统在一般情况下的处理,当系统检测到有锁升级的可能,则会升级锁。一般而言,IS锁升级为 S锁,IX锁升级为 X锁,同时,不再进行行封锁。

    5. 自定义锁定提高系统效率

    DM也提供了两个函数 SET_TABLE_OPTION([db.][sch.]tablename, option, value) 、SET_INDEX_OPTION([db.]indexname, option, value)(具体语法参见《 DM_SQL语言使用手册》第 8 章)供用户自行定义锁定类型,以增强系统并发度,提高系统效率。这两个函数是为那些清楚地知道特定类型的锁适用于何种情况的专家级用户提供的。

    函数SET_TABLE_OPTION() 用于禁用指定表上的页级锁、行级锁或同时禁用二者,这一设置对该表上的所有索引都生效。函数 SET_INDEX_OPTION() 则用于禁用某一索引上的页级锁、行级锁或同时禁用二者。

    例如,当用户只需要修改索引中某定长字段时,修改操作不会造成 B 树的分裂与合并,此时就可以禁用该索引的页级锁。又如,当所有的用户都只做插入操作时,用户之间并不会对同一元组进行操作,此时就可以禁用行级锁。当用户能保证不对表进行增、删、改,而只是进行查询时,则可以同时禁用该表上的页级锁和行级锁,此时并发度最高。

    6. 死锁处理

    解决死锁问题的三种方法:预防死锁、检测死锁及避免死锁。死锁预防要求用户进程事先申报所需的资源或按严格的规程申请资源,而死锁检测原则上应允许死锁发生,在适当的时机检查,若发生死锁,则设法排除之。与预防死锁相比,后者过于放手,致使死锁频繁。而避免死锁则以事务撤消为前提,当不能获得资源批准时,立刻进行死锁检测。它既不象预防死锁那样过于保守,也不象死锁检测那样过于放开,由于检测及时,由归纳法可知,在已获准等待的事务中,不可能存在死锁,所以检测算法比较简单。

    DM4系统采用的是避免死锁方法。每当一个事务所申请占有的资源不能被立即获得时,便进行死锁检测,不存在死锁,则该事务入等待队列。否则,DM4视为产生运行时错误,将当前语句回滚。采用这种机制,从用户的角度看,DM4不存在解锁问题。

    7. 加索引和不加索引的封锁区别

    加索引和不加索引的情况下,DM的封锁机制会影响到实际的封锁范围。索引的作用就在于,可以在查询中减少对无关数据的扫描。而在一般的隔离级中,总是要对扫描到的数据进行封锁。所以,利用索引可以减少封锁的数量,冲突的可能性也会大大减少。

    展开全文
  • 多线程与高并发基本概念

    万次阅读 2018-07-26 23:27:52
    1.同步(Synchronous)与异步(Asynchronous) 同步和异步通常形容一次方法的调用。同步方法调用开始后调用者必须等到方法调用返回才能进行后续行为。... 并发和并行都能表示两个或多个任务一起执...

    1.同步(Synchronous)与异步(Asynchronous)

        同步和异步通常形容一次方法的调用。同步方法调用开始后调用者必须等到方法调用返回才能进行后续行为。异步方法则像一个消息的传递,调用方法后立即返回而方法体则在后台继续运行,调用者无需等待继续后续操作。

    2.并发(Concurrency)和并行(Parallelism)

        并发和并行都能表示两个或多个任务一起执行,但是并发偏重于任务交替执行,多个任务之间很可能是串行的,而并行是真正意义上的"同时执行"。

        严格的来说并行的多个任务是真实的同时执行,而并发是交替的,有系统在任务之间进行切换,即多个任务之间是串行并发,但对人来说会造成多任务是并行的错觉。

    3.临界区

       临界区用来表示一种公共资源或共享数据,可以被多个线程使用,但是一次只能有一个线程使用,一旦临界区资源被占用其他线程如果想要使用这个资源就必须等待。

    4.阻塞(Blocking)和非阻塞(Non-Blocking)

        阻塞和非阻塞通常用来形容多线程的互相影响。当一个线程占用了临界区资源,那么其他需要这个资源的线程必须在这个临界区中进行等待。等待会导致线程挂起,这种情况就是阻塞。非阻塞与之相反,它强调没有一个线程可以妨碍其他线程执行,所有线程都会不断尝试向前执行。

    5.死锁(Deadlock)、饥饿(Starvation)和活锁(Livelock)

        死锁、饥饿和活锁都属于多线程活跃性问题。

        死锁是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象。

        饥饿是指某一个或多个线程因为优先级等原因导致其无法获得所需要的资源,最终导致一直无法执行。

        活锁则是线程之间一直将资源释放给其他线程,这会使资源不断在两个线程中跳动,而没有一个线程可以同时拿到所有资源而正常执行,这种情况就是活锁。

    并发级别

        由于临界区的存在,多线程之间的并发必须受到控制,根据并发的策略大致将并发的级别进行分为阻塞,无饥饿,无障碍,无锁,无等待几种。

    1.阻塞(Blocking)

        一个线程是阻塞的那么在其他线程释放资源前,当前线程无法继续执行。当使用synchonized关键字或者重入锁时,得到的就是阻塞的线程。

        无论是synchonized关键字或者重入锁都会试图在执行后续代码前得到临界区的锁,如果得不到则会挂起等待,直到占有了所需要的资源为止。

    2.无饥饿(Starvation-Free)

        如果线程之间有优先级,那么在线程调度的时候总会倾向于高优先级的线程。如果没有优先级,满足先来后到,则不会产生饥饿。

    3.无障碍(Obstruction-Free)

        无障碍是最弱的的非阻塞调度。两个线程如果都是无障碍的执行,那么他们不会因为临界区的问题导致一方挂起。如果阻塞的控制方式是悲观策略,那么相对来说非阻塞的调度是一种乐观的策略。一种可行的无障碍实现是以来一个“一致性标记”来实现。线程在操作前先读取并保存这个标记,在操作完成后再读取检查这个标记是否被更改如果是一致的则表示资源没有访问冲天,否则表示有其他线程对此资源有过修改需要重试操作。而任何对资源有修改的线程在更改数据前需要更新这个一致性标记,表示数据不安全。

    4.无锁(Lock-Free)

        无锁的并行都是无障碍的。在无锁的情况下,所有的线程都能尝试对临界区的访问,但是无锁的并发保证必然有一个线程能在有限步内完成操作离开临界区。(但是有可能总是不成功会出现类似饥饿的现象)

        在无锁的调用中,典型的特点是包含一个无穷循环,在这个循环中线程会不断尝试修改共享变量。如果没有冲突修改成功则程序退出,否则继续尝试修改。

    5.无等待(Wait-Free)

        无等待是在无锁的基础上更近一步进行扩充,它要求所有线程都必须在有限步内完成,这样就不会引起饥饿问题。

        典型的无等待结构就是RCU(Rrad-Copy-Update)。它的基本思想是对数据的读不进行控制,所以所有的读线程都是无等待。但是写数据是会先取得源数据的副本,然后只修改副本数据,修改完成后在合适的时机回写数据。

    有关并行的两个重要定律

    1.Amdahl定律

    加速比定义:加速比=优化前系统耗时/优化后系统耗时

        根据Amdahl定律使用多核CPU对系统进行优化,优化的效果取决于CPU的熟练以及串行化程序的比重,CPU越多,串行化比重越低,则优化效果越好。仅提高CPU数量而不降低程序的串行化比重也无法提高系统性能。

    2.Gustafson定律

       

    如果串行化比例小,并行化比例大,那么加速比则是处理器个数。只要不断累加处理器就能更快。

    Amdahl强调的是:当串行化比例一定时,加速比是有上限的,不管堆叠多少个CPU进行计算都不能突破上限。

    Gustafson关心的是:如果可悲 并行化代码比重足够多,那么加速比能随着CPU的数量线性增长。

        这两个定律并不矛盾,从极端角度来看,如果系统中没有可被串行化代码(F=1)那么对于两个定律来说加速比都是1。反之两个定律得到的加速比为n(处理器个数)。

    Java:JVM

    1.原子性(Atomicity)

        原子性是指一个操作不可中断。即使是多个线程一起执行的时候,一个操作一旦开始就不会被其它线程干扰。

    如赋值操作int i=10;但是在32位机中的long类型不能保证原子性。

    2.可见性(Visibility)

        可见性是指当一个线程修改了某一个共享变量的值,其它线程是否能立即知道这个修改。在串行程序中可见性问题不存在,因为在任何一个操作中修改了某个变量那么在后续的步骤中读取这个变量的值一定是修改后的新值。

    3.有序性(Ordering)

        有序性问题的原因是因为程序在执行时会进行指令重排,重排后的指令与原指令的顺序未必一致。指令重排序在串行代码中能保证语义一致,但在多线程中并不保证。

    4.那些指令不能重排:Happen-Before规则

    • 程序顺序原则:一个线程内保证语义的串行性
    • volatile规则:volatile变量的写,先发生于读,这保证了volatile变量的可见性
    • 锁规则:解锁必然发生在随后的加锁钱
    • 传递性:A先于B,B先于C,则A先必然于C
    • 线程的start()方法先于它的每一个动作
    • 线程的所有操作先于线程的终结(Thread.join())
    • 线程的中断(interrupt())先于被中断线程的代码
    • 对象的构造函数执行,先于finalize()方法

     

    原文资料《实战Java高并发程序设计》

    展开全文
  • 数据库是一个共享资源,应该允许多个用户程序并行地存取数据,当对数据库进行并行操作时,有可能出现...并发控制就是要用正确的方式调度并发操作,使一个用户事务的执行不受其他事务的干扰,从而避免造成数据的不一...
  • 数据库并发控制

    千次阅读 2012-12-28 19:51:42
    1. 在数据库中为什么要并发控制?  答:数据库是共享资源,通常有许多个事务同时在运行。  当多个事务并发地存取数据库时就会产生同时读取和/或修改同一数据的情况。若对并发操作不加控制就可能会存取和存储不...
  • 并发控制

    2013-06-20 20:54:26
    (1)事务是并发控制基本单元。 (2)数据库中多个事务并发执行时,事务的隔离性和一致性可能会遭到破坏,DBMS需要对并发事务相互作用加以控制,即并发控制机制。 (3)并发操作带来的数据不一致性包括(T1和T2为事务): ...
  • 【3】Java并发编程:多线程基本概念

    千次阅读 2016-06-13 14:45:46
    Java并发编程一直是开发学习中的重点和难点,难在于许多的基本概念不是短时间内就容易理解。下面就Java并发编程中的涉及多线程的基本概念做一个总结:1、TPS(Transactions Per Second,每秒事务处理数) : 一秒内...
  • 【Java并发编程实战】-----线程基本概念

    千次阅读 多人点赞 2015-07-26 10:56:21
    学习Java并发已经有一个...在学习Java并发之前我们需要先理解一些基本概念:共享、可变、线程安全性、线程同步、原子性、可见性、有序性。共享和可变要编写线程安全的代码,其核心在于对共享的和可变的状态进行访问。
  • 并发专业术语定义动作序列:一系列可能与决策分支点相关的动作,其中动作的执行顺序已经完全确定。到达模式:开始并发单元的事件如何到达,可能是定期或不定期。并发:动作序列同时执行。并发单元:在同一个执行线程...
  • 数据库并发控制及SQL Server的 并发控制机制 在多用户和网络环境下,数据库是一个共享资源,多个用户或应用程序同时对数据库的同一数据对象进行读写操作,这种现象称为对数据库的并发操作。显然并发操作可以充分...
  • mysql并发控制

    千次阅读 2019-03-06 12:36:35
    因为可重复度保证了每一行的记录的一致性(也就是说事务处理的基本单位是“行”),所以当事务开始时,读取事务开始的行数据版本即可 小疑问: 为什么只有read-commited读取的是行数据的最新版本?为什么因为...
  • 全面分析 MySQL并发控制

    千次阅读 多人点赞 2020-09-30 21:07:30
    本篇虽然题目说:全面分析,但是谁都知道,并发控制是一个多么庞大的概念是吧,本篇主要讲的是:MySQL的锁、存储引擎、事务处理机制。如果不是你期待的,可以省点时间啦;如果是的话,点赞收藏错不了! MyS.
  • 这是大三第一学期《数据库基础》的实验报告,总共15个实验,前12个百度文库都有,后面三个网上找不到都是我自己...实验14并发控制 本文 实验15数据恢复 点我查看 课程名称数据库基础 实验项目实验14并发控制 ...
  • 数据库中的并发控制

    千次阅读 2017-03-11 17:54:02
    1、写在前面1.1 为什么要并发控制如果事务在并发执行时,来自各个并发事务的所有指令的执行控制都是由操作系统负责,那么许多调度都是可能的。这样,很可能会导致数据库处于不一致的状态。所以,必须保证数据库执行...
  • 【MySQL】并发控制

    千次阅读 2017-02-15 20:12:45
    无论何时,只有有多个查询需要在同一时刻修改数据,都会产生并发控制的问题。这里讨论MySQL在两个层面的并发控制:服务器层与存储引擎层。并发控制是一个内容庞大的话题,有大量的理论文献对其进行详细的论述。在此...
  • Oracle数据库-并发控制

    千次阅读 2017-10-17 13:17:08
    为什么要进行并发控制 三种典型的由并发事务引起的数据不一致现象: 1.丢失修改:  以购票为例,一次购票过程中,剩余票数这个字段需要被读取,更新(x=x-1),写入。两个人A、B同时购票,B在A写入新的票数之前...
  • 数据库并发控制概述

    2019-02-22 10:33:36
    事物是并发控制基本单位。保证事物的ACID特性是事物处理的重要任务。 而事物的ACID特性被破坏的原因之一是多个事物对数据的并发操作造成的。 事物的并发操作会造成三类问题:丢失修改、不可重复读、脏读。 丢失...
  • 数据库并发控制知识点总结

    千次阅读 2016-08-28 13:13:40
    刚看到一篇很不错的数据库并发控制知识点总结,包括一部分可能会出现在笔试面试中的题目,适合对基础概念理解不透彻的我,就转载过来了。  原文地址:http://blog.csdn.net/xiangminjing/article/details/5922325...
  • Linux 设备驱动的并发控制

    千次阅读 2016-03-15 19:26:31
    Linux 设备驱动中必须要解决的一个...1、Linux 并发相关基础概念 a -- 并发(concurrency)  并发指的是多个执行单元同时、并发被执行,而并发的执行单元对共享资源(硬件资源和软件上的全局变量、静态变量等)的访
  • 学习并发编程,那么也需要先掌握其基本概念,然后去学习它的实现原理,最后将其应用到合适的场景中。 一、必备基础概念 1.同步(Synchronous)和异步(Asynchronous) 同步:同步方法一旦调用,那么调用该同步方法...
  • MySQL之锁、事务、并发控制

    千次阅读 2013-11-24 15:39:09
    并发控制 无论何时,只要不止一个查询同时修改数据,都会产生并发控制问题--并发读和并发写。 读锁(Read Lock)/写锁(Write Lock) 锁系统是用于处理并发读或并发写时出现的数据不一致等问题。也称为共享锁...
  • Oracle的并发控制

    千次阅读 2017-05-17 14:12:14
    并发访问带来的问题 丢失更新:一个事务修改某行数据时,另一个事务同时修改了该行数据,使第一个事务对数据的修改丢失。 脏读:一个事务读取了另一个事务未提交的数据。 不可重复读:一个事务再次读取之前...
  • 数据库的事务控制和并发控制

    千次阅读 2007-04-29 13:21:00
    事务控制 事务是并发控制基本单位,也是恢复的基本单位。在SQL中支持事务的概念。所谓事务,是用户定义的一个操作序列(集合),这些操作要么都做,要么一个都 不做,是一个不可分割的整体。一个事务通常以BEGIN ...
  •  并发、并行、串行、同步、异步、阻塞、非阻塞、进程、线程、协程是并发编程中的常见概念,相似却也有却不尽相同,令人头痛,这一篇博文中我们来区分一下这些概念。 2 并发与并行  在解释并发与并行之前,我们...
  • Postgres 数据库并发控制配置

    千次阅读 2012-04-25 09:49:05
    在设置数据库的并发控制之前,请记住, *数据库的事务和锁机制是无法解决第二类丢失更新的* 。 基本资料 事务,锁和事务隔离级别 事务 和 锁 的概念跳过,大家可以自行上网搜索。 事务 是用来...
  • 数据库的并发控制和封锁协议分析

    千次阅读 2015-11-30 13:58:47
    二、事务与并发控制概念 当多用户并发存取数据时,就会产生多个事务同时存取同一数据的情况,从而引起严重的数据错误和程序运行错误。那么我们来看,什么是事务及并发控制呢? 事务就是用户定义的一个
  • 多种数据库的并发控制比较

    千次阅读 2007-03-06 20:20:00
    多种数据库的并发控制比较内容:比较的ORACLE INFORMIX DB2 SYBASE MSSQL等的并发控制机制。比较分析悲观与乐观并发控制机制的异同。引言:l 在关系数据库(DB2,Oracle,Sybase,Informix和SQL Server)最小的恢复...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 152,159
精华内容 60,863
关键字:

并发控制的基本概念