隔离级别和锁定
上述不一致性是由于有并发用户产生的,而在单用户单数据源环境,或同时只允许一个用户执行一个事务的条件下不会发生。因此,如何将这些并发事务隔离在互不干扰的环境中,且能保证最大的并发度就是一个非常重要的课题。
隔离级别(Isolation Level) 确定当存取数据时如何锁定数据或使数据与其他进程隔离开来的程度。 该隔离级别在事务的生存期内有效。 隔离级别和并发度是互相排斥的,为追求最高的隔离级别,我们可能要求对数据的排他访问,即同时只允许一个用户执行一个事务,而此时,并发度是最差的;而要追求最高的并行度,也必须放宽对隔离的要求。
[@more@]
隔离级别可以分为如下四种:
可重复读(Repeatable Read 或 RR):会锁定应用程序在事务中引用 的所有行。 使用可重复读,在相同事务内, 一个应用程序两次发出相同SELECT 语句,每次都给出相同的结果。 用可重复读,不可能出现丢失更新、脏读和幻象读的情况。
事务完成之前,可重复读的应用程序可以任意多次地检索和操作这些行,同时,其他应用程序在此事务完成之前均不能更新、删除或插入可能会影响 结果集的行。
可重复读的应用程序不能查看其他应用程序的未提交的更改。
用可重复读,将会锁定引用的每一行,而不仅仅是检索的那些行,这样,另一个应用程序不可能插入或更新一行,该行可能要被添加到您的查询所产生的结果集中(如果重新执行查询的话)。 这将防止出现幻象读,意味着,如果您扫描10000行并根据条件对它们进行过滤,尽管只有10行满足条件,仍会锁定全部的10000行。
读稳定性(Read Stability 或 RS): 只锁定应用程序在事务中检索的那些行。它确保在事务完成之前,任何在事务期间读取的行不被其它应用程序更改,且在另一个应用程序进程提交更改之前不会读取 那个进程更改的任何行。 也就是说,不可能出现“不可重复读”。
与可重复读不同,有了读稳定性,如果您的应用程序多次发出相同的查询,有 可能看到附加的幻象行 ( 幻象读现象)。
使用刚才的例子,在扫描10000行时, 读稳定性只锁定满足查询条件的行,即只会检索10行,且只在那十行上保持锁定。而此时若采用可重复读,则会在所有的 10000 行上保持锁定。
读稳定性隔离级别可以提供较高的并行性以及数据的稳定视图,对包括下列所有特性的应用程序来说最适用:
Ÿ 在并行环境下运行
Ÿ 需要限定某些行被其他应用的访问来保持其在事务生存期内的稳定
Ÿ 在事务中不会多次发出相同的查询,或者在同一事务中发出多次查询 时并不要求该查询获得相同的回答。
游标稳定性(Cursor Stability 或 CS): 当在行上定位游标时会锁定该行,防止其他应用程序访问该行。 此锁定在读取下一行或终止事务之前有效。然而,如果更改了该行上的任何数据,则在对数据库提交更改之前必须保持该锁定。
在该行上定位任何可更新的游标时,任何其他应用程序都不能更新或删除具有游标稳定性的应用程序在检索的行。同时,游标稳定性应用程序不能查看其他应用程序的未提交的更改。
再次使用扫描 10000行的例子,如果使用游标稳定性,将只锁定当前游标位置下的行。当移离该行时,也就除去了该锁定(除非更新该行)。
使用游标稳定性,可能会出现不可重复读和幻象读现象。 游标稳定性是最常用的隔离级别,因为这在保证更改不会丢失的情况下能得到最大的并行性。
未提交读(Uncommitted Read 或 UR):未提交的读(UR)允许应用程序存取其他事务的未提交的更改。对于只读和可更新的游标,未提交的读的工作方式有所不同。
只读游标可存取其他事务的未提交的更改,其他事务的任何其他更改在提交或回滚前都可被读取。
而可更新的游标的行为和游标稳定性这种隔离级别是一样的,会锁定游标所在行,防止其他游标稳定性的应用程序访问该行。且如果更改了该行上的任何数据,则在对数据库提交更改之前保持该锁定。
对于上述例子,如果使用未提交读这种隔离级别,则不需要对任何行锁定。
使用未提交读,可能出现不可重复读行为和幻象读现象。
未提交读隔离级别对在只读表上的查询最常用,或者如果只执行查询语句且不关心是否可从其他应用程序中看到未提交的数据时也最常用。 未提交读可以提供最大的并行度,但无法保证不发生数据丢失,所以一般只用于只读应用。
隔离级别与一致性问题的关系:
访问未提交数据 | 不可重复读 | 幻象读现象 | |
可重复读(RR) | 不可能 | 不可能 | 不可能 |
读稳定性(RS) | 不可能 | 不可能 | 可能 |
游标稳定性(CS) | 不可能 | 可能 | 可能 |
未提交的读(UR) | 可能 | 可能 | 可能 |
选择隔离级别的准则:
应用程序类型 | 需要高数据稳定性 | 不需要高数据稳定性 |
读写事务 | RS | CS |
只读事务 | RR | UR |
此表提供了简单的启发式方法,可能有助于您为您的应用程序选择隔离级别 。
在实际情况中,可以首先考虑此表列出的方法,并参考先前对各级因素的讨论,定出更适合实际情况的隔离级别。
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/7437037/viewspace-912547/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/7437037/viewspace-912547/