数据库——事务与并发控制

本文深入探讨了数据库中的事务及其并发控制。介绍了事务的定义、特性,强调了并发执行事务的重要性以及可能引发的问题,如丢失修改、读“脏”数据和不可重复读。文章详细阐述了封锁机制,包括不同级别的封锁协议,以及活锁和死锁的概念。还讨论了并发调度的可串行化、两阶段锁协议和多封锁粒度,其中提及了意向锁的概念,以提高并发控制的效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

一、事务概述

1.1定义

1.2特性

二、并发控制概述

2.1事务的并发执行

2.2并发执行导致的问题

2.2.1丢失修改

2.2.2读“脏”数据

2.2.3不可重复读

三、封锁

3.1基本锁类型

3.2封锁协议

3.2.1一级封锁协议

3.2.2二级封锁协议

3.2.3三级封锁协议

3.3活锁与死锁

3.3.1活锁

3.3.2死锁

3.3.3死锁的检测与解除

四、并发调度的可串行化

4.1串行调度与并发调度

4.1.1串行调度

4.1.2并发调度

4.2冲突可串行化

五、两阶段锁协议

六、多封锁粒度

6.1粒度

6.2意向锁


一、事务概述

1.1定义

事务是用户定义的一个数据库操作序列,这些操作要么全做,要么全不做,是一个不可分割的工作单元

事务是并发控制的基本单位,是数据库恢复的基本单位,是数据库的逻辑基本逻辑单元

数据库恢复机制和并发控制机制是数据库管理系统的重要组成部分

在关系数据库中,一个事务可以是一条SQL语句,一组SQL语句或整个程序

--显式定义事务
begin transaction 
SQL 语句1 
……  ……
commit / rollback

/*
commit
    事务正常结束
    提交事务的所有操作(读+更新)
    事务中所有对数据库的更新写回到磁盘上的物理数据库中

rollback
    事务异常终止
    事务运行的过程中发生了故障,不能继续执行
    系统将事务中对数据库的所有已完成的操作全部撤销
    事务滚回到开始时的状态
*/
--将数学课程号由2修改为22
/*
解析:
所涉及的关系:Course和SC,根据参照完整性约束,应将两表中的2都改为22。要将修改两个表的两个SQL语句定义成一个事务。因为DBMS对这两个语句要么都执行,要不都不执行
*/

begin transaction
    update Course set CNO='22' where CNO='2'
    update SC set CNO='2' where CNO='22'
commit

 

1.2特性

原子性 

  • 事务是数据库的逻辑工作单元
  • 事务的所有操作要么都全部成功地执行,要么都不执行
  • 若事务因故障而中止,则要设法消除该事务所产生的影响,使数据库恢复到该事务执行前的状态

一致性

  • 事务执行的结果必须使数据库从一个一致性状态转变到另一个一致性状态

隔离性 

  • 一个事务的执行不能被其他事务干扰。多个事务并发执行,任何事物的更新操作直到其成功提交,对其他事务都是不可见的

持久性 

  • 一个事务完成后,它对数据库的改变必须是永久的,即使系统出现故障,它对数据库的更新也将永久有效

 

 

二、并发控制概述

事务的并发执行是数据库系统提高系统效率的有效方法,但可能破坏事务的 ACID性质,导致数据的不一致性

2.1事务的并发执行

1、并发执行的理由

  • 提高吞吐量和资源利用率
  • 减少等待时间

2、并发执行方式

  • 交叉并发方式
  1. 单机系统中,事务的并行操作轮流交叉运行
  2. 优点:能够减少处理机的空闲时间,提高系统的效率
  3. 缺点:不是真正的并发操作,可能会产生数据不一致
  • 同时并发方式
  1. 多处理机系统中,每个处理机可以运行一个事务,多个处理机可以同时运行多个事务,实现多个事务真正的并行运行
  2. 优点:最理想的并发方式
  3. 缺点:受制于硬件环境,同样可能会产生数据不一致

 

2.2并发执行导致的问题

2.2.1丢失修改

2.2.2读“脏”数据

2.2.3不可重复读

产生原因

  • 事务T1读取某一数据后,事务T2对其做了修改,事务T1再次读取该数据时,发现与前次不同
  • 事务T1按一定条件读取了某些数据记录后,事务T2删除了其中的部分记录,事务T1再次按相同条件读取记录时,发现有些记录不存在
  • 事务T1按一定条件读取了某些数据记录后,事务T2插入了一些记录,事务T1再次按相同条件读取记录时,发现多了一些记录

 

例:飞机订票系统中的一个活动序列

①甲售票点(事务T1)读出某航班的机票余额A,设A=16;

②乙售票点(事务T2)读出同一航班的机票余额A,也为16;

③甲售票点卖出一张机票,修改余额A←A-1,所以A为15,把A写回数据库;

④乙售票点也卖出一张机票,修改余额A←A-1,所以A为15,把A写回数据库

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

这种情况称为数据库的不一致性,是由并发操作引起的

在并发操作情况下,对T1、T2两个事务的操作序列的调度是随机的。若按上面的调度序列执行,T1事务的修改就被丢失。原因:第4步中T2事务修改A并写回后覆盖了T1事务的修改

产生上述三类不一致性的主要原因就是并发操作破坏了事务的隔离性。并发控制就是要用正确的方式调度并发操作,使某个事务的执行不受其它事务的干扰

并发控制的主要技术:封锁、时间戳、乐观控制法、多版本并发控制

 

 

三、封锁

封锁即事务在对某个数据对象操作之前

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值