一、概念
DB2为了解决数据一致性的问题,在其设计中集成了下列机制:
1、事务
事务也称工作单元,是将一个或多个SQL操作组合成一个单元的可恢复操作序列,通常位于应用程序进程中。事务具有原子性,要么全做(提交),要么全不做(回滚)。一般情况下,执行commit或rollback来停止事务。
2、锁
关系数据库中,最小的恢复和交易单位是事务,事务具有ACID(原子性、一致性、隔离性和永久性)特征。关系数据库为了确保并发用户在存取同一数据库对象时的正确性(即无丢失更新、可重复读、不读'脏"数据、无"幻像”读),数据库中引入了并发(锁)机制。
基本的锁有两种类型:排他锁(Exclusive locks,记为X锁)和共享锁(Share locks,记为S锁)。
锁是一种用来将数据资源与单个事务关联起来的机制,其用途就是当某个资源与拥有它的事务关联在一起的时候,控制其他事务如何与该资源进行交互。在事务终止前,就一直持有该锁;该事务终止时释放锁,其他事务就可以使用被解锁的数据资源了。
如果一个事务尝试访问数据资源的方式与另一个事务锁持有的锁不兼容,则该事务等待,知道拥有锁的事务终止为止,这被称为锁等待。
通过对数据库对象加锁,我们可以避免一下情况发生:
1)由于并发更改造成数据丢失(幻像读)
2)读取了未提交的数据(脏读)
3)防止不可重复读
3、隔离级别
维护数据库的一致性和数据完整性,同时又允许多个应用程序同时访问同一数据,这样的特性成为并发性。DB2数据库用来尝试强制实施并发性的方法之一是通过使用隔离级别,它决定在第一个事务访问数据时,如何对其他事务锁定或隔离该事务所使用的数据。
DB2使用下列隔离级别来强制实施并发性:
可重复读(Repeatable Read) 【可防止所有现象,并发最差】
读稳定性(Read Stability) 『幻像读』
游标稳定性(Cursor Stability)【默认】 『会出现不可重复读和幻像读』
未提交读(Uncommitted Read) 『会出现脏读、不可重复读和幻像读』,并发最好』
可重复读,应用程序将对所有被扫描过的行都加锁;
读稳定性,应用程序只对符合要求的所有行家锁;
游标稳定性,只锁定事务声明并打开的游标当前锁引用的行;
未提交读,仅当另一个事务试图删除或更改被检索的行所在的表时,才会锁定该检索的行。
通常,使用的隔离级别越严格,并发性越小,某些应用程序的性能还肯能会越低,因为他们要等待资源上的锁被释放。如何确定隔离级别呢?最好的方法是确定哪些现象是不可接受的,然后选择能够防止这些现象发生的隔离级别:
如果正在执行大型查询,并且不希望并发事务所做的修改会导致查询的多次运行而返回不同的结果,则使用可重复的读隔离级别;
如果希望在应用程序之间获得一定的并发性,并且希望限定的行在事务执行期间保持稳定,则使用读隔离级别;
如果希望获得最大的并发性,同时不希望查询看到未提交的数据,则使用游标稳定性隔离级别;
如果正在读取的表,视图,数据库上执行查询,或者不介意查询是否返回未提交的数据,则使用未提交读隔离级别。
阅读(2625) | 评论(0) | 转发(0) |