数据库原理-事务基本概念

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据库原理-事务基本概念相关的知识,希望对你有一定的参考价值。

2018-1-9 by Atlas

  • 数据库访问

read(X):把数据X,从磁盘的数据库中读到内存的缓冲区中。
write(X):把数据X,从内存的缓存区写回磁盘的数据库。

  • ACID性质

1、原子性(Atomicity)
一个事务对数据的所有操作,是一个不可分割的工作单元。这些操作要么全部执行,要么什么也不做(就对DB的效果而言)。
保证原子性是数据库系统本身的职责,由DBMS的事务管理子系统实现。
2、一致性(Consistency)
一个事务独立执行的结果,应保持数据库的一致性,即数据不会因事务的执行而遭受破坏。
确保单个事务的一致性是编写事务的应用程序员的职责,在系统运行时,由DBMS的完整性子系统执行测试任务。
3、隔离性(Isolation)
在多个事务并发执行时,系统应保证与这些事务先后单独执行时的结果一样,此时称事务达到了隔离性的要求。也就是在多个事务并发执行时,保证执行结果是正确的,如同单用户环境一样。
隔离性是由DBMS的并发控制子系统实现的。
4、持久性(Durability)
一个事务一旦完成全部操作后,它对数据库的所有更新应永久地反映在数据库中,不会丢失。即使以后系统发生故障,也是如此。
持久性由DBMS的恢复管理子系统实现的。

  • 检查点技术

REDO(重做)和UNDO(撤销)处理,实际上是采用检查点(Checkpoint)方法实现的。
两次检查点和其中间故障点把事务分为五类:
T1:事务到达第一次检查点前已经完成。
T2:事务在第一次检查点前开始直到故障点前已经完成。
T3:事务在第一次检查点前开始直到故障点没有完成。
T4:事务在第一次检查点后开始直到故障点前已经完成。
T5:事务在第一次检查点后开始直到故障点没有完成。
故障处理:

  • 事务T1不必恢复。因为它们的更新已经在第一次检查点时写到数据库中了。
  • 事务T2和事务T4必须重做(REDO)。因为它们结束在下一个检查点之前。它们对DB的修改仍在内存缓冲区,还未写到磁盘。
  • 事务T3和事务T5必须撤销(UNDO)。因为它们还未做完,必须撤销事务已对DB作的修改。

  • 数据库并发操作问题

  • 丢失更新问题:
    数据库中A的初值是100,事务T1对A的值减30,事务T2对A的值增加1倍。如果执行次序是先T1后T2,那么结果A的值是140。如果先执行T2后T1,那么A的值是170。这两种情况都应该是正确的。但事务T1读A的值执行中事务T2也读A的值执行,先执行完的事务更新的值被后执行完的事务更新的值覆盖,结果丢失了先执行完的事务对数据库的更新操作。因而这个并发操作是不正确的。
  • 读脏数据问题:
    (1)数据库中A的初值是100,事务T1把A的值修改为70,但尚未提交(即未做COMMIT操作),事务T2紧跟着读未提交的A值(70)。随后,事务T1做ROLLBACK操作,把A的值恢复为100。而事务T2仍在使用被撤销了的A值(70)。在数据库技术中,把未提交的随后被撤销的数据称为“脏数据”。
    (2)数据库中A的初值是100,事务T1把A的值修改为70,但尚未提交(即未做COMMIT操作),事务T2紧跟着读未提交的A值(70)。事务T2对A的值增加1倍,执行完的事务T2对数据库作更新操作。随后,事务T1做ROLLBACK操作,把A的值恢复为100。结果丢失了事务T2对数据库的更新操作。破坏了数据库的完整性。
  • 不可重复读问题:
    数据库中A的初值是100,事务T1需要两次读取同一数据项A,但是在两次读操作的间隔中,另一个事务T2改变了A的值。因此,T1在两次读同一数据项A时却读出了不同的值。

  • 封锁技术

锁(Lock)是一个与数据项相关的变量,对可能应用于该数据项上的操作而言,锁描述了该数据项的状态。
通常在数据库中每个数据项都有一个锁。锁的作用是使并发事务对数据库中数据项的访问能够同步。封锁技术中主要有两种封锁:排他型封锁和共享型封锁。

  • 排他型封锁(X锁):
    Exclusive Lock 简称X锁,又称写锁。
    定义:如果事务T对某个数据R(可以是数据项、记录、数据集乃至整个数据库)实现了X锁,那么在T对数据R解除封锁之前,不允许其他事务T再对该数据加任何类型的锁。这种锁称为“X锁”。
    使用X锁的操作有两个:
    (1)申请X锁操作“XFIND R”:表示事务对数据R申请加X锁,若成功,则可以读或写数据R;如果不成功,那么这个事务将进入等待队列,一直到获准X锁,事务才能继续做下去。
    (2)解除X锁操作“XRELEASE R”:表示事务要解除对数据R的X锁。
    在一个事务对数据加上X锁后,并且对数据进行了修改,如果过早地解锁,有可能使其他事务读了未提交数据(且随后被回退),引起丢失其他事务的更新。为了解决这个问题,X锁的解除操作应该合并到事务的结束(COMMIT或ROLLBACK)操作中。也就是系统中没有解除X锁操作的语句,在COMMIT语句和ROLLBACK语句中包含了解除X锁的操作。
  • 共享型封锁(S锁):
    Shared Lock 简称S锁,又称读锁。
    定义:如果事务T对某数据加上S锁后,仍允许其他事务再对该数据加S锁,但在对数据的所有S锁都解除之前决不允许任何事务对该数据加X锁。
    使用S锁的操作有三个:
    (1)申请S锁操作“SFIND R”:表示事务对数据R申请加S锁,若成功,则可以读数据R,但不可以写数据R;如果不成功,那么这个事务将进入等待队列,一直到获准S锁,事务才能继续做下去。
    (2)升级和写操作“UPDX R”:表示事务要把对数据R的S锁升级为X锁,若成功则更新数据R,否则这个事务进入等待队列。
    (3)解除S锁操作“SRELEASE R”:表示事务要解除对数据R的S锁。
    可以看出,获准S锁的事务只能读数据,不能更新数据,若有更新,则先要把S锁升级为X锁。另外,由于S锁只允许读数据,因此解除S锁的操作不必要合并到事务的结束操作中去,可以随时根据需要解除S锁。
  • 封锁粒度:
    定义:封锁对象的大小称为封锁粒度。
    封锁的对象可以是逻辑单元,也可以是物理单元。在数据库中,封锁对象可以是属性值、属性值集合、元组、关系、索引项、整个索引、整个数据库等逻辑单元;也可以是页(数据页或索引页)、块等物理单元。
    封锁粒度与系统的并发度和并发控制的开销密切相关。封锁的粒度越大,并发度也就越小,但同时系统的开销也就越小;相反,封锁的粒度越小,并发度越高,但系统的开销也就越大。

  • 事务的存取模式

(1)READ ONLY(只读型):事务对数据库的操作只能是读操作。定义这个模式后,表示随后的事务均是只读型。
(2)READ WRITE(读写型):事务对数据的操作可以是读操作,也可以是写操作。定义这个模式后,表示随后的事务均是读写型。在程序开始时默认这种模式。

  • 事务的隔离级别

(1)SERIALIZEABLE(可串行化):允许事务与其他事务并发执行,但系统必须保证并发调用是可串行化,不致发生错误。
(2)REPEATABLE READ(可重复读):只允许事务读已提交的数据,并且在两次读同一数据时不允许其他事务修改此数据。
(3)READ COMMITTED(读提交数据):允许事务读已提交的数据,但不要求“可重复读”。
(4)READ UNCOMMITTED(可以读未提交数据):允许事务读已提交或未提交的数据。

  • 语句定义:
    SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
    SET TRANSACTION ISOLATION LEVEL REPEATABLE READ
    SET TRANSACTION ISOLATION LEVEL READ COMMITTED
    SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED

摘抄自:《数据库原理》

以上是关于数据库原理-事务基本概念的主要内容,如果未能解决你的问题,请参考以下文章

分布式事务处理基本原理

数据库事务——事务的特性(ACID)

数据库事务——事务的特性(ACID)

MySQL 事务的实现原理

数据库事务的概念及其实现原理

事务的实现原理