数据库中的并发操作带来的一系列问题及解决方法

数据库中常见的并发操作所带来的一致性问题包括:丢失的修改、不可重复读、读脏数据、幻影读(幻影读在一些资料中往往与不可重复读归为一类)。
丢失修改

下面我们先来看一个例子,说明并发操作带来的数据的不一致性问题。

考虑飞机订票系统中的一个活动序列:
甲售票点(甲事务)读出某航班的机票余额A,设A=16.
乙售票点(乙事务)读出同一航班的机票余额A,也为16.
甲售票点卖出一张机票,修改余额A←A-1.所以A为15,把A写回数据库.
乙售票点也卖出一张机票,修改余额A←A-1.所以A为15,把A写回数据库.

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

归纳起来就是:两个事务T1和T2读入同一数据并修改,T2提交的结果破坏了T1提交的结果,导致T1的修改被丢失。前文(2.1.4数据删除与更新)中提到的问题及解决办法往往是针对此类并发问题的。但仍然有几类问题通过上面的方法解决不了,那就是:
 不可重复读

不可重复读是指事务T1读取数据后,事务T2执行更新操作,使T1无法再现前一次读取结果。具体地讲,不可重复读包括三种情况:
事务T1读取某一数据后,事务T2对其做了修改,当事务1再次读该数据时,得到与前一次不同的值。例如,T1读取B=100进行运算,T2读取同一数据B,对其进行修改后将B=200写回数据库。T1为了对读取值校对重读B,B已为200,与第一次读取值不一致。
事务T1按一定条件从数据库中读取了某些数据记录后,事务T2删除了其中部分记录,当T1再次按相同条件读取数据时,发现某些记录神密地消失了。
事务T1按一定条件从数据库中读取某些数据记录后,事务T2插入了一些记录,当T1再次按相同条件读取数据时,发现多了一些记录。(这也叫做幻影读) 
读"脏"数据

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

产生上述三类数据不一致性的主要原因是并发操作破坏了事务的隔离性。并发控制就是要用正确的方式调度并发操作,使一个用户事务的执行不受其它事务的干扰,从而避免造成数据的不一致性。
并发一致性问题的解决办法
 封锁(Locking)

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

基本的封锁类型有两种:排它锁(Exclusive locks 简记为X锁)和共享锁(Share locks 简记为S锁)。

排它锁又称为写锁。若事务T对数据对象A加上X锁,则只允许T读取和修改A,其它任何事务都不能再对A加任何类型的锁,直到T释放A上的锁。这就保证了其它事务在T释放A上的锁之前不能再读取和修改A。

共享锁又称为读锁。若事务T对数据对象A加上S锁,则其它事务只能再对A加S锁,而不能加X锁,直到T释放A上的S锁。这就保证了其它事务可以读A,但在T释放A上的S锁之前不能对A做任何修改。
封锁协议

在运用X锁和S锁这两种基本封锁,对数据对象加锁时,还需要约定一些规则,例如应何时申请X锁或S锁、持锁时间、何时释放等。我们称这些规则为封锁协议(Locking Protocol)。对封锁方式规定不同的规则,就形成了各种不同的封锁协议。下面介绍三级封锁协议。三级封锁协议分别在不同程度上解决了丢失的修改、不可重复读和读"脏"数据等不一致性问题,为并发操作的正确调度提供一定的保证。下面只给出三级封锁协议的定义,不再做过多探讨。
1级封锁协议

1级封锁协议是:事务T在修改数据R之前必须先对其加X锁,直到事务结束才释放。事务结束包括正常结束(COMMIT)和非正常结束(ROLLBACK)。1级封锁协议可防止丢失修改,并保证事务T是可恢复的。在1级封锁协议中,如果仅仅是读数据不对其进行修改,是不需要加锁的,所以它不能保证可重复读和不读"脏"数据。
2级封锁协议

2级封锁协议是:1级封锁协议加上事务T在读取数据R之前必须先对其加S锁,读完后即可释放S锁。2级封锁协议除防止了丢失修改,还可进一步防止读"脏"数据。
3级封锁协议

3级封锁协议是:1级封锁协议加上事务T在读取数据R之前必须先对其加S锁,直到事务结束才释放。3级封锁协议除防止了丢失修改和不读'脏'数据外,还进一步防止了不可重复读。
事务隔离级别

尽管数据库理论对并发一致性问题提供了完善的解决机制,但让程序员自己去控制如何加锁以及加锁、解锁的时机显然是很困难的事情。索性绝大多数数据库以及开发工具都提供了事务隔离级别,让用户以一种更轻松的方式处理并发一致性问题。常见的事务隔离级别包括:ReadUnCommitted、ReadCommitted、RepeatableRead和Serializable四种。不同的隔离级别下对数据库的访问方式以及数据库的返回结果有可能是不同的。我们将通过几个实验深入了解事务隔离级别以及SQL Server在后台是如何将它们转换成锁的。
 Serializable

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

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

repeatable read

1:所有的select在第一次一致读以后在事务中都会使用一样的数据状态快照。

2:update,delete都会使用间隙锁来保证数据的安全。防止phantom。

3:这是采用最广的事务隔离级别,也是mysql默认的事务隔离级别。


read commited

1:每一个select都会使用各自的数据状态的快照。

2:如果当前的数据状态已更新到最新,但是当单个select的时候仍然会产生不一致的数据状态。

3:更少的间隙锁意味着更少的死锁。

4:唯一key的检查在第二索引和其它外键检查的时候也会产生间隙所。(gap必须被锁定以防止在parent row被删除后仍在child row中插入相关数据)。

5:这种隔离级别也是使用的非常普遍的隔离级别尤其是在5.1以后的版本中。

6:征对在5.0更早的版本中,可以通过innodb_locks_unsafe_for_binlog移除gap locking。

(In V5.1, most gap-locking is removed w/ this level, but you MUST use row-based logging/replication。)


read uncommitted

1:这种隔离级别几乎不被使用,在select将会看到各种奇怪的数据现象,当然包括其它事务还未提交的数据。

2:强烈不推荐,不能保证数据的一致性。


  • 7
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
一、简答题 1、什么是数据与程序的物理独立性?什么是数据与程序的逻辑独立性? ①物理独立性是指用户的应用程序与数据库数据的物理存储是相互独立的。也就是说,数据在数据库怎样存储是由数据库管理系统管理的,用户程序不需要了解,应用程序要处理的只是数据的逻辑结构,这样当数据的物理存储改变时应用程序不用改变。 ②逻辑独立性是指用户的应用程序与数据库的逻辑结构是相互独立的。也就是说,数据的逻辑结构改变时用户程序也可以不变。 2、试述等值连接与自然连接的区别和联系。 连接运算符是“=”的连接运算称为等值连接。它是从关系R与S的广义笛卡尔积选取A,B属性值相等的那些元组 自然连接是一种特殊的等值连接,它要求两个关系进行比较的分量必须是相同的属性组,并且在结果把重复的属性列去掉。 3、试述实现数据库安全性控制的常用方法和技术。 ( l )用户标识和鉴别:该方法由系统提供一定的方式让用户标识自己的名字或身份。每次用户要求进入系统时,由系统进行核对,通过鉴定后才提供系统的使用权。 **( 2 )存取控制:**通过用户权限定义和合法权检查确保只有合法权限的用户访问数据库,所有未被授权的人员无法存取数据。例如CZ 级的自主存取控制( DAC ) , Bl 级的强制存取控制(MAC )。 **( 3 )视图机制:**为不同的用户定义视图,通过视图机制把要保密的数据对无权存取的用户隐藏起来,从而自动地对数据提供一定程度的安全保护。 ( 4 )审计:建立审计日志,把用户对数据库的所有操作自动记录下来放入审计日志,DBA 可以利用审计跟踪的信息,重现导致数据库现有状况的一系列事件,找出非法存取数据的人、时间和内容等。 **( 5 )数据加密:**对存储和传输的数据进行加密处理,从而使得不知道解密算法的人无法获知数据的内容。 4、试述关系模型的三类完整性规则,并举例说明。 实体完整性:所谓的实体完整性就是指关系(所谓的关系就是表)的主码不能取空值; 例子: (1) 实体完整性规则:若属性 A 是基本关系 R 的主属性,则属性 A 不能取空值。 **参照完整性:**是指参照关系每个元素的外码要么为空(NULL),要么等于被参照关系某个元素的主码; 例子: (2) 参照完整性规则:若属性(或属性组) F 是基本关系 R 的外码,它与基本关系 S 的主码 K s 相对应(基本关系 R 和 S 不一定是不同的关系),则对于 R 每个元组在 F 上的值必须为: 或者取空值( F 的每个属性值均为空值); 或者等于 S 某个元组的主码值。 用户定义的完整性:指对关系每个属性的取值作一个限制(或称为约束)的具体定义。 5、一个不好的模式会有些什么问题? ①数据冗余 ②更新异常 ③插入异常 ④删除异常 6、数据库设计,需求分析的任务是什么?调查的内容是什么? 需求分析阶段的设计目标是通过详细调查现实世界要处理的对象(组织、部门、企业等),充分了解原系统手工系统或计算机系统)工作概况明确用户的各种需求,然后在此基础上确定新系统的功能。 **调查的内容是“数据”和“处理”**即获得用户对数据库的如下要求: (1)信息要求指用户需要从数据库获得信息的内容与性质由信息要求可以导出数据要求即在数据库需要存储哪些数据。 (2)处理要求指用户要完成什么处理功能,对处理的响应时间有什么要求,处理方式是批处理还是联机处理。 (3)安全性与完整性要求 7、什么是索引?索引的作用。 索引是对数据库一列或多列的值进行排序的一种结构,使用索引可快速访问数据库的特定信息。 建立索引是加快查询速度的有效手段,数据库索引类似于图书后面的索引,能快速定位到需要查询的内容,用户可以根据应用环境的需要在基本表上建立一个或者多个
数据库设计系列之⼀ 数据库设计系列之⼀ ⾸先来认识下什么是数据库设计? 这⾥要解释下DBMS是什么? 数据库管理系统(Database Management System)是⼀种操纵和管理数据库的⼤型软件,是⽤于建⽴、使⽤和维护数据库的,简称 DBMS。它对数据库进⾏统⼀的管理和控制,以保证数据库的安全性和完整性,⽤户通过DBMS访问数据库的数据,数据库管理员也通过 DBMS进⾏数据库的维护⼯作,它提供多种功能,可使多个应⽤程序和⽤户⽤不同的⽅法在同时或不同时刻去建⽴、修改和访问数据库。 图书管理员在查找⼀本书的时候,⾸先通过⽬录检索找到那本书的分类号和书号,然后在书库找到那⼀类书的书架,并在哪个书架上按 照书号的⼤⼩次序查找,这样很快就能找到我们所需要的书,数据库⾥⾯的数据就像图书馆的书⼀样,也要让⼈能够⽅便的找到才⾏。 如果所有的书都按不规则的放在⼀起,胡乱堆在任何地⽅,那么借书的⼈,呵呵,他绝逼不会借书。这⾥说的⽐较粗俗,不要介意。同样 的道理计算上的数据都像这样⽆序的堆放在⼀起,让⼈⽆法查找,那么这种数据集合并不能够称之为数据库数据库管理系统是从图书馆的管理⽅法改进⽽来,21世纪, 资料太多,信息太多,⼤家都往电脑⾥⾯放,这样导致电脑的资料越来越 多,这时候数据库管理系统的出现解决了管理这些资料的难题,它是通过⼀些编制好的计算机程序对这些资料进⾏管理,顾名思义,它这样 就可以帮助我们管理输⼊到计算机的⼤量数据,就像图书管理员。 按功能划分,数据库管理系统⼤致可分为6个部分:    (1)模式:提供数据定义语⾔(DDL)。⽤它书写的数据库模式被翻译为内部表⽰。数据库的逻辑结构、完整性约束和物理储存结构保存在内部 的数据库的各种数据操作(如查找、修改、插⼊和删除等)和数据库的维护管理都是以数据库模式为依据的。    (2)应⽤程序的编译:把包含着访问数据库语句的应⽤程序,编译成在DBMS⽀持下可运⾏的⽬标程序。    (3)交互式查询:提供易使⽤的交互式查询语⾔,如。DBMS负责执⾏查询命令,并将查询结果显⽰在屏幕上。    (4)数据的组织与存取:提供数据在外围储存设备上的物理组织与存取⽅法。    (5)事务运⾏管理:提供事务运⾏管理及运⾏⽇志,事务运⾏的安全性监控和检查,事务的并发控制及系统恢复等功能。    (6)数据库的维护:为数据库管理员提供软件⽀持,包括数据安全控制、完整性保障、数据库备份、以及性能监控等维护⼯具。 基于关系模型的数据库管理系统已⽇益完善,并作为商品化软件⼴泛应⽤于各⾏各业,它在各服务器结构的分布式多⽤户环境的应⽤,使 数据库系统的应⽤进⼀步扩展。随着新型数据模型及数据管理的实现技术的推进,可以预期DBMS软件的性能还将更新和完善,应⽤领域也 将进⼀步地拓宽。 数据库管理系统(DBMS)是为了适应信息化社会对数据管理技术的需求,在近⼗多年来迅速发展起来的⼀门新兴学科。   计算机数据管 理技术⼤致经历了三个发展阶段:   ⾃由管理阶段   ⽤户以⽂件形式将数据组织起来,并附属在各⾃的应⽤程序下。   ⽂件管理阶 段   操作系统的⽂件系统给出了统⼀的⽂件结构和共同存取的⽅法,⽤户可以把数据和信息作为⽂件长期地保存在计算机系统,并可 以⽅便地进⾏查询和处理。   数据库管理阶段   为了适应⼤量数据的集存储,并提供给多个⽤户共享的要求,使数据与程序完全独 ⽴,最⼤限度地减少数据的,出现了数据库管理系统。   著名数据库管理系统   MS SQL   SYBASE   DB2   ORACLE    MySQL   ACCESS   VF   它所提供的功能有以下⼏项:   (1)、数据定义功能。   (2)、数据管理功能。   (3)、对 数据库进⾏保护。   (4)、数据库的建⽴和维护。   (5)、数据库的传输。
### 回答1: 数据库数据不一致问题通常可以通过以下方法解决: 1. 使用数据库事务:通过将一系列操作组成一个事务,可以保证这些操作要么全部成功执行,要么全部回滚,从而避免数据不一致问题。 2. 引入缓存:使用缓存可以提高系统的性能,但是需要考虑缓存和数据库之间的一致性,可以使用缓存穿透、缓存雪崩等技术来解决。 3. 使用分布式锁:在多个线程或进程同时访问数据库时,可以使用分布式锁来保证只有一个线程或进程能够修改数据,避免数据不一致问题。 4. 数据库主从同步:使用数据库主从同步可以将数据实时同步到从库,从而保证数据的一致性。 5. 数据库定时同步:定时将主库的数据同步到从库,也可以保证数据的一致性。 以上方法可以有效地解决数据库数据不一致问题。 ### 回答2: 数据库数据不一致是指在数据库存储的数据与实际应该存储的数据不一致的情况。在处理数据库数据不一致问题时,可以采取以下几种解决方法: 1. 数据备份与恢复:通过进行定期的数据备份,可以在发现数据库数据不一致问题时恢复到之前的备份点,保证数据的一致性。备份可以使用数据库自身的备份工具或第三方备份软件进行。 2. 数据一致性检查与修复:可以定期或根据需要对数据库进行一致性检查,比对数据库存储的数据与实际应该存储的数据,发现不一致的数据后,通过数据修复操作进行修复。 3. 定期数据同步:对于分布式系统或跨多个数据库的应用,可以通过定期进行数据同步操作,把数据从一个数据库同步到其他数据库,以保证数据的一致性。 4. 引入事务机制:事务可以保证一组操作的原子性、一致性、隔离性和持久性。在数据库操作引入事务机制,可以将一系列操作视为一个整体,如果其某一步出现错误,可以回滚到初始状态,保证数据的一致性。 5. 异常处理与错误日志:在出现数据库数据不一致问题时,及时捕获并记录异常,同时记录错误日志,通过查看日志了解问题发生的原因并及时采取相应措施解决问题。 6. 定位与解决数据冲突:当多个用户同时对数据库进行读写操作时,可能会发生数据冲突问题。可以通过锁机制、并发控制机制或乐观锁等方法解决数据冲突问题,保证数据的一致性。 综上所述,处理数据库数据不一致问题可以通过数据备份与恢复、数据一致性检查与修复、定期数据同步、引入事务机制、异常处理与错误日志、定位与解决数据冲突等方法解决。根据实际情况选择合适的解决方法可以保证数据库数据的一致性

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值