欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

ORACLE數(shù)據(jù)庫(kù)事務(wù)隔離級(jí)別介紹

 更新時(shí)間:2012年07月27日 08:31:25   作者:  
事務(wù)隔離級(jí)別:一個(gè)事務(wù)對(duì)數(shù)據(jù)庫(kù)的修改與并行的另一個(gè)事務(wù)的隔離程度

兩個(gè)并發(fā)事務(wù)同時(shí)訪問數(shù)據(jù)庫(kù)表相同的行時(shí),可能存在以下三個(gè)問題:

1、幻想讀:事務(wù)T1讀取一條指定where條件的語句,返回結(jié)果集。此時(shí)事務(wù)T2插入一行新記錄,恰好滿足T1的where條件。然后T1使用相同的條件再次查詢,結(jié)果集中可以看到T2插入的記錄,這條新紀(jì)錄就是幻想。

2、不可重復(fù)讀取:事務(wù)T1讀取一行記錄,緊接著事務(wù)T2修改了T1剛剛讀取的記錄,然后T1再次查詢,發(fā)現(xiàn)與第一次讀取的記錄不同,這稱為不可重復(fù)讀。

3、臟讀:事務(wù)T1更新了一行記錄,還未提交所做的修改,這個(gè)T2讀取了更新后的數(shù)據(jù),然后T1執(zhí)行回滾操作,取消剛才的修改,所以T2所讀取的行就無效,也就是臟數(shù)據(jù)。

一、為了處理這些問題,SQL標(biāo)準(zhǔn)定義了以下幾種事務(wù)隔離級(jí)別:

READ UNCOMMITTED 幻想讀、不可重復(fù)讀和臟讀都允許。一個(gè)會(huì)話可以讀取其他事務(wù)未提交的更新結(jié)果,如果這個(gè)事務(wù)最后以回滾結(jié)束,這時(shí)的讀取結(jié)果就可能是不正確的,所以多數(shù)的數(shù)據(jù)庫(kù)都不會(huì)運(yùn)用這種隔離級(jí)別。

READ COMMITTED 允許幻想讀、不可重復(fù)讀,不允許臟讀。一個(gè)會(huì)話只能讀取其他事務(wù)已提交的更新結(jié)果,否則,發(fā)生等待,但是其他會(huì)話可以修改這個(gè)事務(wù)中被讀取的記錄,而不必等待事務(wù)結(jié)束,顯然,在這種隔離級(jí)別下,一個(gè)事務(wù)中的兩個(gè)相同的讀取操作,其結(jié)果可能不同。

REPEATABLE READ 允許幻想讀,不允許不可重復(fù)讀和臟讀。在一個(gè)事務(wù)中,如果在兩次相同條件的讀取操作之間沒有添加記錄的操作,也沒有其他更新操作導(dǎo)致在這個(gè)查詢條件下記錄數(shù)增多,則兩次讀取結(jié)果相同。換句話說,就是在一個(gè)事務(wù)中第一次讀取的記錄保證不會(huì)在這個(gè)事務(wù)期間發(fā)生改動(dòng)。SQL Server是通過在整個(gè)事務(wù)期間給讀取的記錄加鎖實(shí)現(xiàn)這種隔離級(jí)別的,這樣,在這個(gè)事務(wù)結(jié)束前,其他會(huì)話不能修改事務(wù)中讀取的記錄,而只能等待事務(wù)結(jié)束,但是SQL Server不會(huì)阻礙其他會(huì)話向表中添加記錄,也不阻礙其他會(huì)話修改其他記錄。

SERIALIZABLE 幻想讀、不可重復(fù)讀和臟讀都不允許。在一個(gè)事務(wù)中,讀取操作的結(jié)果是在這個(gè)事務(wù)開始之前其他事務(wù)就已經(jīng)提交的記錄,SQL Server通過在整個(gè)事務(wù)期間給表加鎖實(shí)現(xiàn)這種隔離級(jí)別。在這種隔離級(jí)別下,對(duì)這個(gè)表的所有DML操作都是不允許的,即要等待事務(wù)結(jié)束,這樣就保證了在一個(gè)事務(wù)中的兩次讀取操作的結(jié)果肯定是相同的。SQL標(biāo)準(zhǔn)所定義的默認(rèn)事務(wù)隔離級(jí)別是SERIALIZABLE。

二、Oracle中的隔離級(jí)別及實(shí)現(xiàn)機(jī)制:

Oracle數(shù)據(jù)庫(kù)支持READ COMMITTED 和 SERIALIZABLE這兩種事務(wù)隔離級(jí)別。所以O(shè)racle不支持臟讀,即Oracle中不允許一個(gè)會(huì)話讀取其他事務(wù)未提交的數(shù)據(jù)修改結(jié)果,從而防止了由于事務(wù)回滾發(fā)生的讀取不正確。

Oracle回滾段,在修改數(shù)據(jù)記錄時(shí),會(huì)把這些記錄被修改之前的結(jié)果存入回滾段或撤銷段中。Oracle讀取操作不會(huì)阻礙更新操作,更新操作也不會(huì)阻礙讀取操作,這樣在Oracle中的各種隔離級(jí)別下,讀取操作都不會(huì)等待更新事務(wù)結(jié)束,更新操作也不會(huì)因?yàn)榱硪粋€(gè)事務(wù)中的讀取操作而發(fā)生等待,這也是Oracle事務(wù)處理的一個(gè)優(yōu)勢(shì)所在。

Oracle缺省的配置是Read Committed隔離級(jí)別(也稱為語句級(jí)別的隔離),在這種隔離級(jí)別下,如果一個(gè)事務(wù)正在對(duì)某個(gè)表執(zhí)行 DML操作,而這時(shí)另外一個(gè)會(huì)話對(duì)這個(gè)表的記錄執(zhí)行讀取操作,則Oracle會(huì)去讀取回滾段或撤銷段中存放的更新之前的記錄,而不會(huì)象SQL Server一樣等待更新事務(wù)的結(jié)束。

Oracle的Serializable隔離級(jí)別(也稱為事務(wù)級(jí)別的隔離),事務(wù)中的讀取操作只能讀取這個(gè)事務(wù)開始之前已經(jīng)提交的數(shù)據(jù)結(jié)果。如果在讀取時(shí),其他事務(wù)正在對(duì)記錄執(zhí)行修改,則Oracle就會(huì)在回滾段或撤銷段中去尋找對(duì)應(yīng)的原來未經(jīng)修改的記錄(而且是在讀取操作所在的事務(wù)開始之前存放于回滾段或撤銷段的記錄),這時(shí)讀取操作也不會(huì)因?yàn)橄鄳?yīng)記錄被更新而等待。

設(shè)置隔離級(jí)別使用 SET TRANSACTION ISOLATION LEVEL [READ UNCOMMITTED|READ COMMITTED|REPEATABLE READ|SERIALIZABLE]

下面是oracle 設(shè)置SERIALIZABLE隔離級(jí)別一個(gè)示例:

左面是事務(wù)T1,右面是事務(wù)T2,因?yàn)門2級(jí)別為SERIALIZABLE,所以即使事務(wù)T1在提交了數(shù)據(jù)之后,事務(wù)T2還是看不到T1提交的數(shù)據(jù),幻想讀和不可重復(fù)讀都不允許了。

那如何能查看到T1新增的記錄呢? 上面T1和T2是并發(fā)執(zhí)行,在T1執(zhí)行insert的時(shí)候事務(wù)T2已經(jīng)開始了,因?yàn)門2級(jí)別是SERIALIZABLE,所以T2所查詢的數(shù)據(jù)集是T2事務(wù)開始前數(shù)據(jù)庫(kù)的數(shù)據(jù)。即事務(wù)T1在事務(wù)T2開始之后的insert和update操作的影響都不會(huì)影響事務(wù)T2。現(xiàn)在重新開啟一個(gè)事務(wù)T3 就可以看到T1新增的記錄了。

當(dāng)下列事件發(fā)生時(shí),事務(wù)就開始了:

1、連接到數(shù)據(jù)庫(kù),并執(zhí)行第一條DML語句
2、前一個(gè)事務(wù)結(jié)束后,又輸入了另一條DML語句

相關(guān)文章

最新評(píng)論