数据库并发控制技术

2023-08-10 1474阅读

温馨提示:这篇文章已超过370天没有更新,请注意相关的内容是否还可用!

数据库是可供多个用户使用的共享资源。其他用户程序必须等到该用户程序结束后才能访问数据库。但如果用户程序涉及大量数据的I/O交换,则数据库系统大部分时间是空闲的。因此,为了充分利用数据库资源,发挥数据库共享资源的特点,应允许多个用户并行访问数据库。如果不控制并发操作,可能会访问和存储错误的数据,从而破坏数据库的一致性。因此,数据库管理系统必须提供并发控制机制。并发控制机制的好坏是衡量一个数据库管理系统性能的重要标志之一。DM使用阻塞机制来解决并发问题。并发控制以事务为单位进行。

数据库是可供多个用户使用的共享资源。 这些用户程序可以一一串行执行。 一次只有一个用户程序运行来访问数据库。 其他用户程序必须等到该用户程序结束后才能访问数据库。 但如果用户程序涉及大量数据的I/O交换,则数据库系统大部分时间是空闲的。 因此,为了充分利用数据库资源,发挥数据库共享资源的特点,应允许多个用户并行访问数据库。 但这样的话,多个用户程序就会同时访问相同的数据。 如果不控制并发操作,可能会访问和存储错误的数据,从而破坏数据库的一致性。 因此,数据库管理系统必须提供并发控制机制。 并发控制机制的好坏是衡量一个数据库管理系统性能的重要标志之一。

DM使用阻塞机制来解决并发问题。 它保证任一时刻可以有多个用户程序运行,但所有用户程序都运行在彼此完全隔离的环境中。

1. 并发控制初步知识

(1)并发控制概述

并发控制以事务为单位进行。

1、并发控制的单位——事务

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

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

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

(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中的事务也具有上述四个属性:原子性、一致性、隔离性和持久性。

2、并发操作与数据不一致

如果没有锁,多个用户同时访问数据库,当他们的事务同时使用相同的数据时,就会出现问题,导致数据库中的数据不一致。

并发操作最常见的示例之一是火车/飞机预订系统中的预订操作。 例如,该系统中的一系列活动:

① 售票员A读出某航班票号的余额A,令A=16;

② 售票员B读出同航班票号的余额A,也是16;

③售票员A售票,修改票数余额A=A-1=15,并将A写回数据库;

④售票员B也售票,修改票数余额A=A-1=15,并将A写回数据库。

结果明显是卖出了两张票,而数据库中这张票的余额只减少了1。

这种情况称为数据库不一致。 这种不一致是由两个导体A和B并发操作造成的。在并发操作的情况下,A和B的两个事务操作顺序的调度是随机的。 如果按照上述调度顺序,事务A的修改将会丢失。 这是因为在第4步中,事务B修改了A,并写回了事务A的修改。

并发操作引起的数据库不一致可以分为四类:丢失或覆盖更新、脏读、不可重复读和幻读。 上面的例子只是并发问题之一。

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

当两个或多个事务选择相同的数据并根据最初选择的值更新该数据时,就会发生丢失更新问题。 每笔交易都不知道其他交易的存在。 最后一次更新将覆盖其他事务所做的更新,这将导致数据丢失。 上面预订机票的例子就属于这种并发问题。 事务1和事务2连续读取到相同的数据A=16,事务1执行A-1࿰

VPS购买请点击我

文章版权声明:除非注明,否则均为主机测评原创文章,转载或复制请以超链接形式并注明出处。

目录[+]