GBase新闻

专注于数据库软件产品和服务,致力于成为用户最信赖的数据库产品供应商

南大通用GBase 8s数据库的封锁与并发事务调度(一)

发布时间:2025-02-25

本文探讨南大通用GBase 8s数据库的事务处理特性,揭示其如何确保ACID特性,并有效管理并发事务。

事务的概念及ACID特性

事务(Transaction)

将用户在数据库中的某些操作集合看作一个整体,在其有序执行的过程中不被其他操作影响,这样的操作集合就是事务。

事务(Transaction)是对数据库进行操作的集合。该集合是一个不可分割的具有逻辑功能的工作单元,集合中的操作在事务的一次执行中必须全部被执行或者全部。

事务的特性(ACID 特性)

Atomicity: 原子性

构成该事务的操作集合中的全部操作在事务的运行过程中全部执行或者全部不执行。

Consistency: 一致性

事务运行的结果应该使数据库保持数据一致性。

Isolation:隔离性

构成某个事务的全部操作与其他事务或操作是隔离的,同时执行的事务之间不能够互相影响,一个事务单独运行的结果应该与该事务和其他多个事务同时运行的结果一致。

Durability: 持久性

事务的持久性是指事务运行完毕并成功提交后,其对数据库全部操作的结果应该永久地保留在数据库中。

并发事务的调度

1、并发问题和并发操作

实际应用中,通常会有来自不同用户的多个事务并发执行,事务之间会有交叉,这个问题就是事务的并发问题。

并发事务之间相互影响,会破坏相关事务的正常运行,无法保证事务的 ACID 特性,产生数据错误。

并发操作(Simultaneous Concurrency)是并发事务中包含的对数据库的操作,由多个事务并发进行而产生,其最大问题是容易导致数据库的不一致性

举例说明

两个售票点同时售出同一天同一车次的车票,第一个售票点执行的数据库事务 T1 为:

(1)读出当前车票的剩余数量 A,假设 A=50;

(2)售出一张票,剩余数量变为 A=A-1,即 A=49。

第二个售票点执行的数据库事务 T2 为:

(1)读出当前车票的剩余数量 A,假设 A=50;

(2)售出一张票,剩余数量变为 A=A-1,即 A=49。

事务 T1 和 T2 按照如下顺序并发执行:

(1)读出当前车票的剩余数量 A,假设 A=50;

(2)读出当前车票的剩余数量 A,假设 A=50;

(3)售出一张票,剩余数量变为 A=A-1,即 A=49;

(4)售出一张票,剩余数量变为 A=A-1,即 A=49。

事务执行的结果是只卖了一张车票,而实际上售出了两张,这样就可能导致同一个座位售出两张车票,数据库出现了数据的不一致性错误。

并发操作导致数据库出现数据不一致性的问题,如下表所示。事务 T1 将数据对象,即火车票的总数 A 进行了修改,变为 49,而事务 T2 在 T1 修改 A 之前读取的 A 的值仍然是 50,T2 将此值修改为 49 后写回数据库并覆盖了 T1 事务对 A 的修改,此时,A 的值为49,就会出现这种情况:卖出两张车票后车票总数应为 48,而数据库中车票的总数为 49,显然出现了数据的不一致性错误。

2、调度

调度(Schedule)是指事务的执行次序。如果多个事务依次执行,则称为事务的串行调度(Serial Schedule)。如果多个事务同时执行,则称为事务的并发调度(Concurrent Schedule)

3、冲突

冲突(conflict):事务调度中的两个操作(读操作或写操作),如果交换顺序执行,它们所属的事务运行结果会改变,那么这两个操作就被称为冲突。

不同事务对于不同数据对象进行操作(无论是读操作还是写操作)不会产生冲突;不同事务对同一数据对象进行读操作也不会产生冲突。

4、封锁

并发控制的主要技术是封锁(Locking)。封锁的对象是数据库中的数据对象,如关系型数据库中的表、记录、属性、索引等。对数据对象加锁的时机是在事务对其进行操作之前,向系统发出加锁请求。

加锁后事务 T就取得了对该数据对象的控制,在事务 T 释放它的锁之前,其他事务不能对此数据对象进行任何操作。

封锁是一种排队机制,将并行任务按锁的先后顺序排队,把并行任务变成串行任务。