首页 > 编程知识 正文

数据库删除空值,赃款的处理方式

时间:2023-05-06 08:21:53 阅读:167225 作者:3592

丢失的修正,无法重复阅读,阅读肮脏的数据,阅读幻影

常见的并发一致性问题包括丢失修复、不可重复读取、脏数据读取和幻影读取。 幻影读取在某些资料中经常被归类为不可重复的读取。

消除修正

让我们先看一个例子。 对同时操作导致的数据不匹配进行说明。

考虑飞机预约系统的活动序列:

甲的售票处(甲事务)读取某航班的机票余额a,设A=16。

乙售票处(乙事务)读了同一航班的机票余额a也是16。

在甲方售票处卖一张机票,余额AA-1 .所以a是15,把a写回数据库。

乙售票处也卖一张机票,余额AA-1 .所以a是15,把a写回数据库。

结果,明明卖了两张机票,数据库的机票余额却只减少了1。

总之,两个事务T1和T2读取和修改了相同的数据,T2提交的结果破坏了T1提交的结果,T1的修改丢失。 前文(2.1.4数据的删除和更新)所述的问题和解决方案,多是针对这种同时问题进行的。 但是,有一些问题无法通过上述方法解决。 那个如下

不能重复

非可重复读取是指事务T1读取数据后,事务T2执行更新操作,以使T1无法再现上次读取的结果。 具体来说,有三种情况不能重复阅读。

如果事务T1读取了数据,则事务T2修改它,如果事务T1再次读取了该数据,则得到与上次不同的值。 例如,T1读取B=100并进行运算,T2读取相同的数据b,将其修正后将B=200写回数据库。 为了T1读取值校正而重新读取b时,b为200,与第1次读取值不一致。

发现事务T1在一定条件下从数据库中读取了某些数据记录后,事务T2删除了其中的一部分记录,当T1再次在相同条件下读取数据时,某个记录神奇地消失了。

发现当事务T1在一定条件下从数据库中读取了某些数据记录后,事务T2插入了一些记录,而T1再次在相同条件下读取了数据时,又增加了一些记录。 (这也称为幻影读) ) ) )。

阅读“肮脏”的数据

“脏”数据是指,修改事务T1的数据并写回盘,如果事务T2在读取了相同的数据后,由于某种原因T1被取消,则修改了T1的数据恢复为原来的值,T2读取的数据成为数据库

这三种数据不一致的主要原因是并发操作会破坏事务的隔离性。 并发控制是指以适当的方式调度并发操作以避免一个用户的事务受到其他事务的干扰,从而避免数据不一致。

并发性问题的解决方案

(块) )。

块是实现并发控制的非常重要的技术。 封锁是指在操作有事务t的数据对象,例如表、记录等之前,向系统发出请求,进行锁定。 锁定的事务t控制数据对象。 在事务t解除锁定之前,其他事务无法更新数据对象。

的两种基本块类型:独占锁(Exclusive locks简称为x锁)、共享锁(Share locks简称为s锁)。

独占锁也称为写入锁。 当事务t对数据对象a执行x锁定时,t只允许读取和修改a,其他事务在t解除对a的锁定之前不能对a执行任何类型的锁定。 这样,在t解除对a的锁定之前,其他事务就不能读取和更改a。

共享锁也称为读取锁。 如果事务t对数据对象a执行了s锁定,则其他事务只能对a执行s锁定,而不能执行x锁定,直到t释放了对a的s锁定。 这样,其他事务就可以读取a,但在t解除a的s锁之前不能对a进行更改。

封锁合同

利用x锁和s锁这两种基本锁锁定数据对象时,还必须约定何时申请x锁和s锁、锁保持时间、何时释放等规则。 这些规则称为锁定协议(Locking Protocol )。 如果对封锁方式规定不同的规则,就会形成各种各样的封锁协定。 介绍三级封锁合同。 第三级块协议在一定程度上解决了诸如丢失的修改、不可重复的读取和读取“脏”数据等不一致性,并为准确调度并发操作提供了一定的保证。 以下只给出三级区块合同的定义,不多讨论。

一级封锁协议

一级阻塞协议是,事务t在修改数据r之前必须先进行x锁定,并且在事务结束之前不会释放。 事务的结束包括成功结束(COMMIT )和非成功结束(ROLLBACK )。 一级阻止协议可防止更改丢失,并确保事务t是可恢复的。 一级数据块协议不能保证重复读取或不读取“脏”数据,因为只有通过读取和修改数据才能完成锁定。

二级街区合同

2级的块协议,1级的块协议和事务t在读取数据r之前必须加锁,读取结束后可以解除s锁。 2级阻止协议不仅可以防止修复丢失,还可以进一步防止读取“脏”数据。

三级封锁合同

三级块协议必须在一级块协议和事务t读取数据r之前施加s锁定,直到事务结束才被释放。 3级数据块协议不仅可以防止修改和“脏”数据丢失,还可以防止无法重复读取。

事务隔离级别

虽然数据库理论为并发一致性问题提供了完善的解决机制,但程序员本身显然很难控制如何上锁、上锁、解锁的时机。 简而言之,大多数数据库和开发工具都提供了事务隔离级别,使用户可以更轻松地处理并发一致性问题。 典型的事务隔离级别为“读已提交”、“读已提交”和“已提交”

d和Serializable四种。不同的隔离级别下对数据库的访问方式以及数据库的返回结果有可能是不同的。我们将通过几个实验深入了解事务隔离级别以及SQL Server在后台是如何将它们转换成锁的。

Serializable

Serializable隔离级别是最高的事务隔离级别,在此隔离级别下,不会出现读脏数据、不可重复读和幻影读的问题。在详细说明为什么之前首先让我们看看什么是幻影读。

所谓幻影读是指:事务1按一定条件从数据库中读取某些数据记录后,事务2插入了一些符合事务1检索条件的新记录,当事务1再次按相同条件读取数据时,发现多了一些记录。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。