需要防止的現象和事務隔離級別
ansi/iso sql 標準(sql92)定義了四種事務隔離級別(transaction isolation level),這四種隔離級別所能提供的事務處理能力各不相同。這些事務隔離級別是針對三種現象定義的,在併發事務執行時,需要阻止這三種現象 中的一種或多種發生。
三種需要阻止的現象(preventable phenomena)是:
* 髒讀取(dirty read):乙個事務讀取了被其他事務寫入但還未提交的資料。
* 不可重複讀(nonrepeatable read):乙個事務再次讀取其之前曾經讀取過的資料時,發現資料已被其他已提交的事務修改或刪除。
* 不存在讀(虛讀)(phantom read):事務按照之前的條件重新查詢時,返回的結果集中包含其他已提交事務插入的滿足條件的新資料。
sql92 標準中定義了四個隔離級別,在各隔離級別中,允許發生上述三種需要阻止的現象中的一種或多種。詳細情況如下:
各隔離級別中允許出現的需要防止的讀取現象
隔離級別 髒讀取 不可重複讀取 不存在讀取
讀未提交 允許 允許 允許
(read uncommitted)
讀已提交 不允許 允許 允許
(read committed)
可重複讀 不允許 不允許 允許
(repeatable read)
序列化 不允許 不允許 不允許
(serializable)
oracle 支援三種事務隔離級別:已提交讀取,序列化,以及 sql92 中沒有包含的唯讀模式(read-only mode)。已提交讀取是 oracle 預設使用的事務隔離級別。
oracle常常使用語句級(state-level)一致性,保證資料在語句的生命期之間是可見的但不能被改變。事務由多個語句組成,當使用事務時,事物級(transaction-level)一致性在整個事務生命期中保證資料對所有語句都是可見的。
oracle通過scn(syatem change number)實施一致性。乙個scn是乙個面向時間的資料庫內部鍵。scn只會增加不會減少,scn表示了時間上的乙個點,每個資料塊都有乙個scn,通過比較這個點實施操作。
事務級一致性
set transaction 的乙個作用是確保事務級一致或語句級一致中有乙個實施。oracle使用這些術語:
isolation level read committed 表示語句級一致
isolation level serializable 表示事務級一致。
例:設定隔離級別
1、設定乙個事務的隔離級別
set transaction isolation level read committed;
set transaction isolation level serializable;
2、設定增個會話的隔離級別
alter session set isolation_level= read committed;
alter session set isolation_level= serializable;
下面的語句也能確保事務級一致:
set transcation read only
任何企圖在唯讀(read only)事務中修改資料的操作都會丟擲乙個異常。但是,read only事務只能在下列語句中使用:
select(沒有for update子句)
lock table
set role
alter system
alter alarm
即使沒有改變任何資料,read only事務依然必須使用乙個commit或rollback以結束整個事務。
事務隔離級別
1 serializable 最嚴格的spring事務隔離級別,事務序列執行,資源消耗最大 3 read committed 大多數主流資料庫的預設spring事務隔離等級,保證了乙個事務不會讀到另乙個並行事務已修改但未提交的資料,避免了 髒讀取 該級別適用於大多數系統。4 read uncommi...
事務隔離級別
四種隔離級別 隔離級別 髒 讀不可重複讀取 幻 像讀操作未提交 read uncommitted 是是 是讀操作已提交 read committed 否是 是可重複讀 repeatable read 否否 是快照否否 否可序列讀 serializable 否否 否 sql server 還支援使用行...
事務隔離級別
1.read uncommitted 讀未提交。可以讀取未提交的資料。比如 我有乙個賬戶裡面有1000元,對方給我打了1000還未提交,我這時檢視會有2000,我以為收到了,放心睡覺去了,可是對方他這1000給回滾了。實際我賬戶還是1000 這是髒讀 2.read committed 讀提交。讀到資...