请选择 进入手机版 | 继续访问电脑版

湖南新梦想

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 597|回复: 0

掌握Oracle、MySQL、DB2并发控制机制的异同(上)

[复制链接]

2775

主题

3174

帖子

1万

积分

论坛元老

Rank: 8Rank: 8

积分
11260
发表于 2020-11-30 17:15:20 | 显示全部楼层 |阅读模式
 [url=]数据库[/url]的并发控制机制,顾名思义,是用来控制数据库的并发操作的机制。控制的目的是为了保证数据完整和数据一致性。
  何为数据一致性?在数据库的并发操作中,多个事务同时读取同一份数据,要保证多个事务读取的同一份数据是准确的。
  可能数据的不一致更好理解。例如事务T1、T2同时更新余额为1000余额表, T1减100元,更新余额为900元,T2减500元,更新余额为500元;在T2不知道T1已经更新的情况下直接把余额更新为500元,丢失了T1对余额的更新,此时的数据不能反映真实情况,数据变得不一致。并发事务处理过程中,还可能出现事务T1修改了一条[url=]记录[/url],事务T2读取该记录后,事务T1被撤销,此时T2读取的数据就与数据库中的数据不一致,该数据就为“脏”数据。
  因此并发操作中,需要确保事务的隔离性以保证数据的一致性。那么如何确保事务的隔离性呢?接下来,我们将对DB2、[url=]MySQL[/url][url=]Oracle[/url]三种数据库的并发控制机制进行比较分析。
  数据库的数据一致性支持机制:事务、锁、日志。
  首先我们看看什么是事务。
  一、事务
  事务:又称为交易,访问数据库系统的可恢复的最小单元。
  1、事务的ACID
  原子性(Atomicity):事务为一个整体的工作单元,事务对数据库的操作要么全部执行,要么全部取消;
  一致性(Consistency):事务完成时,所有数据都保持一致状态;
  隔离性(Isolation):事务所做的修改必须与其他事务所做的修改隔离。事务查看数据时数据的状态要么为其他事务修改之前要么为其他事务修改之后,不会为中间状态。即多个事务不能同时修改同一份数据;
  持久性(Durability):事务提交后,对数据库所做的修改会永久保存。
  2、事务的初始化和终止
  事务在可执行的[url=]SQL[/url]第一次执行时会自动初始化,事务一旦初始化,就必须终止(COMMIT或ROLLBACK)。
  1)关于事务的COMMIT和ROLLBACK
  多数情况下,事务通过执行COMMIT或ROLLBACK终止事务。执行COMMIT语句后,事务初始化后对数据库做出的所有改变都会变成永久的;执行ROLLBACK语句后,事务初始化后对数据库做出的所有改变都会被撤销,数据库返回事务开始之前的状态。
  2)关于不成功的事务的结果
  上面说了当事务被COMMIT或ROLLBACK终止语句后会发生什么,如果事务完成之前系统发生故障,会发生什么?这种情况下,数据库管理器将撤销所有未COMMIT的修改,从而恢复数据的一致性。
  DB2中通过ACTIVE LOG日志文件实现撤销修改。日志文件包含关于事务执行的每个语句的信息,以及事务是否被成功COMMIT或ROLLBACK的信息。
  MySQL和Oracle利用undo log撤销修改。undo log记录了行的修改操作,执行事务中由于某种原因失败,或使用ROLLBACK时,就可以利用undo log将数据恢复到修改之前的样子。
  3、事务的隔离级别
  1)潜在问题
  事务为什么需要多种可以设置的隔离级别呢?通常,锁可以实现并发操作中事务的隔离,保证数据的一致性。锁提高了并发性能,但会带来潜在的问题:
  脏读:当前事务可以读到另外一个事务中未提交的数据。
  不可重复读:在一个事务内读到的同一条数据是不一样的。
  幻读:事务A在相同条件下第二次读取时读到新插入的数据。
  丢失更新:一个事务的更新操作会被另一个事务的更新操作所覆盖,从而导致数据的不一致。 例如:
  事务T1将行记录修改为V1,事务T1未提交。
  事务T2将行记录修改为V2,事务T2未提交。
  事务T1提交。
  事务T2提交。
  在当前数据库的锁机制下不会导致理论意义上的丢失更新问题,但是实际上在所有多用户计算机系统环境下都有可能产生这个问题。例如:
  事务T1查询一行数据,放入本地内存,显示给User1。
  事务T2查询一行数据,放入本地内存,显示给User2。
  User1修改这行记录,更新数据库并提交。
  User2修改这行记录,更新数据库并提交。
  这些问题往往和系统数据库的使用方式和形态有关。而设置事务的隔离级别,就是根据不同的场景来解决以上问题。比如上面所说的丢失更新问题,隔离级别中SELECT…FOR UPDATE即带有更新意图读的时候,步骤1、2都是要上写锁的,避免丢失更新的问题。下面详解数据库的隔离级别及其加锁方式。
  2)数据库的隔离级别及其加锁方式
  ① SQL标准定义的四个隔离级别
  READ UNCOMMITTED:未提交读。事务可以看到其他事务所有未提交的数据。读取数据不加锁;
  READ COMMITTED:提交读。事务只可以看到其他事务已经提交的数据;
  REPEATABLE READ:重复度。锁定事务引用的符合检索条件的部分行,其他事务不可修改这些行,但可执行INSERT操作。即可能出现幻读;
  SERIALIZABLE:可串行化。强制的进行排序,在每个读数据行上添加锁,所有事务依次逐个执行,事务之间不会产生干扰。事务提交后释放锁。会导致大量超时现象和锁竞争。
  ② 四种隔离级别会导致的问题
  ③ 数据库中的隔离级别
  DB2中的隔离级别:
  CS(Cursor Stability):游标稳定性。逐行锁定数据,该行数据未修改时,锁定解除,继续加锁读取下一行,该行数据有修改时,则该行锁定持续到事务终止。CS的程序不能查看其他程序未COMMIT的更改。
  CS提供了最大的并发性。但同一事务同一游标被处理两次,可能返回不同的结果,即不可重复度;CS程序读取的行上有任何可更新游标时,其他任何应用程序都不能更新或删除该行。
  CS是DB2默认的隔离级别。在需要最大并行性但只能看到其他程序已COMMIT的数据时使用。
  RR(Repeatable Read):可重复读。RR会锁定事务引用的所有行,直到COMMIT。其他程序不能修改该数据,如果一条数据被访问两次,返回相同的结果。

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|湖南新梦想 ( 湘ICP备18019834号-2 )

GMT+8, 2022-6-29 15:11 , Processed in 0.046065 second(s), 20 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表