您好、欢迎来到现金彩票网!
当前位置:彩运网 > 封锁粒度 >

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

发布时间:2019-06-07 01:17 来源:未知 编辑:admin

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

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

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

  定义:如果事务T对某个数据R(可以是数据项、记录、数据集乃至整个数据库)实现了X锁,那么在T对数据R解除封锁之前,不允许其他事务T再对该数据加任何类型的锁。这种锁称为“X锁”。

  (1)申请X锁操作“XFIND R”:表示事务对数据R申请加X锁,若成功,则可以读或写数据R;如果不成功,那么这个事务将进入等待队列,一直到获准X锁,事务才能继续做下去。

  (2)解除X锁操作“XRELEASE R”:表示事务要解除对数据R的X锁。

  在一个事务对数据加上X锁后,并且对数据进行了修改,如果过早地解锁,有可能使其他事务读了未提交数据(且随后被回退),引起丢失其他事务的更新。为了解决这个问题,X锁的解除操作应该合并到事务的结束(COMMIT或ROLLBACK)操作中。也就是系统中没有解除X锁操作的语句,在COMMIT语句和ROLLBACK语句中包含了解除X锁的操作。

  定义:如果事务T对某数据加上S锁后,仍允许其他事务再对该数据加S锁,但在对数据的所有S锁都解除之前决不允许任何事务对该数据加X锁。

  (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(可以读未提交数据):允许事务读已提交或未提交的数据。

http://funnyland.net/fengsuolidu/333.html
锟斤拷锟斤拷锟斤拷QQ微锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷微锟斤拷
关于我们|联系我们|版权声明|网站地图|
Copyright © 2002-2019 现金彩票 版权所有