数据库---事务和锁

事务


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

事务是恢复和并发控制的基本单位。

事务和程序

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

一个程序通常包含多个事务。

COMMIT

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

ROLLBACK

事务异常终止
事务运行的过程中发生了故障,不能继续执行
系统将事务中对数据库的所有已完成的操作全部撤销
事务滚回到开始时的状态

事务的特性(ACID)

恢复系统保证原子性持久性
并发控制系统保证隔离性一致性

原子性(Atomicity)

事务中包含的所有操作要么全做,要么全不做。

原子性由恢复系统实现。

一致性(Consistency)

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

事务开始前,数据库处于一致性的状态;事务结束后,数据库必须仍处于一致性状态;事务的执行过程中可以暂时的不一致。
数据库的一致性状态由用户来负责,由并发控制系统实现。

如银行转账,转账前后两个帐户金额之和应保持不变。

两种状态:

一致性状态
数据库中只包含成功事务提交的结果。

不一致状态
数据库系统运行中发生故障,有些事务尚未完成就被迫中断;
这些未完成事务对数据库所做的修改有一部分已写入物理数据库,这时数据库就处于一种不正确的状态 。

隔离性(Isolation)

系统必须保证事务不受其它并发执行事务的影响。

对任何一对事务T1,T2,在T1看来,T2要么在T1开始之前已经结束,要么在T1完成之后再开始执行。

隔离性通过并发控制系统实现。

持久性(Durability)

一个事务一旦提交之后,它对数据库的影响必须是永久的。系统发生故障不能改变事务的持久性。

持久性通过恢复系统实现。

并发操作带来的不一致性

由于并发操作破坏了事务的隔离性。

1.丢失修改(Lost Update)

两个事务T1和T2读入同一数据并修改,T2的提交结果破坏了T1提交的结果,导致T1的修改被丢失。

2.不可重复读(Non-repeatable Read)

不可重复读是指事务T1读取数据后,事务T2执行更新操作,使T1无法再现前一次读取结果。

  • 事务T1读取某一数据后,事务T2对其做了修改,当事务T1再次读该数据时,得到与前一次不同的值。
  • 事务T1按一定条件从数据库中读取了某些数据记录后,事务T2删除了其中部分记录,当T1再次按相同条件读取数据时,发现某些记录神秘地消失了。
  • 事务T1按一定条件从数据库中读取某些数据记录后,事务T2插入了一些记录,当T1再次按相同条件读取数据时,发现多了一些记录。

后两种不可重复读有时也称为幻影现象(Phantom Row)

3.读“脏”数据(Dirty Read)

读“脏”数据是指:
事务T1修改某一数据,并将其写回磁盘
事务T2读取同一数据后,T1由于某种原因被撤销
这时T1已修改过的数据恢复原值,T2读到的数据就与数据库中的数据不一致
T2读到的数据就为“脏”数据,即不正确的数据 。

以下部分内容来自于 数据库系统概念

事务的隔离性按照隔离级别从低到高的顺序:

1、未提交读:

允许读取未提交数据。
(当事务A更新某条数据时,不容许其他事务来更新该数据,但可以读取。)

2、已提交读:

只允许读取已提交数据,但不要求可重复读。
(当事务A更新某条数据时,不容许其他事务进行任何操作包括读取,但事务A读取时,其他事务可以进行读取、更新。)

3、可重复读:

只允许读取已提交数据,而且一个事务两次读取一个数据项期间,其他事务不得更新该数据,但是该事务不要求与其他事务可串行化。

4、可串行化:

保证可串行化调度。

以上所有隔离级别都不允许脏写,即如果一个数据项已经被另外一个尚未提交的事务写入,则不允许对该数据项执行写操作。
在这里插入图片描述

并发控制的主要技术

1、封锁(Locking)
2、时间戳(Timestamp)
3、乐观控制法
4、多版本并发控制(MVCC)

下面主要是封锁机制:

封锁就是事务T在对某个数据对象(例如表、记录等)操作之前,先向系统发出请求,对其加锁。
加锁后事务T就对该数据对象有了一定的控制,在事务T释放它的锁之前,其它的事务不能更新此数据对象。

基本封锁类型

  • 排它锁(Exclusive Locks,简记为X锁)(写锁)
  • 共享锁(Share Locks,简记为S锁)(读锁)

在这里插入图片描述

两段锁协议

“两段”锁的含义
事务分为两个阶段:

1、第一阶段是获得封锁,也称为扩展阶段

事务可以申请获得任何数据项上的任何类型的锁,但是不能释放任何锁。

2、第二阶段是释放封锁,也称为收缩阶段

事务可以释放任何数据项上的任何类型的锁,但是不能再申请任何锁。

封锁粒度

封锁对象的大小称为封锁粒度(Granularity)

封锁的对象为逻辑单元,物理单元 。
在关系数据库中,封锁对象:
逻辑单元: 属性值、属性值的集合、元组、关系、索引项、整个索引、整个数据库等。
物理单元:页(数据页或索引页)、物理记录等。

封锁粒度与系统的并发度和并发控制的开销密切相关。

  • 封锁的粒度越大,数据库所能够封锁的数据单元就越少,并发度就越小,系统开销也越小。
  • 封锁的粒度越小,并发度较高,但系统开销也就越大。