初始資料表資料
dbms_lock.sleep(10); --暫停10秒
commit;
end;
**2
begin
update userinfo set detpghetsyu=1 where detpghetsyu is null;
dbms_lock.sleep(10); --暫停10秒
commit;
end;
先後在10秒內執行,最後結果為首次執行的事務(實際是首先執行update語句,也就是先拿到鎖的事務)
事務1執行了10秒多多,事務2執行了17秒多,事務1在commit後釋放鎖後,事務2獲得鎖並開始執行。
恢復原資料,執行如下sql
**1
begin
update userinfo set detpghetsyu=0 where username='user1';
dbms_lock.sleep(10); --暫時10秒
commit;
end;
**2
begin
update userinfo set detpghetsyu=1 where username='user2';
dbms_lock.sleep(10); --暫停10秒
commit;
end;
緊挨著執行,執行後結果如下
兩事務執行時間都為10秒多一點,說明事務鎖是根據where後的條件鎖的行。
三種需要阻止的現象(preventable phenomena)是:
1、髒讀取(dirty read):乙個事務讀取了被其他事務寫入但還未提交的資料。
2、不可重複讀取(nonrepeatable read):乙個事務再次讀取其之前曾經讀取過的資料時,發現資料已被其他已提交的事務修改或刪除。
3、不存在讀取、幻讀(phantom read):事務按照之前的條件重新查詢時,返回的結果集中包含其他已提交事務插入的滿足條件的新資料。
sql92 標準中定義了四個隔離級別,在各隔離級別中,允許發生上述三種需要阻止的現象中的一種或多種。詳情見下表 現象
髒讀取不可重複讀取
不存在讀取
隔離級別
未提交讀取(read uncommitted)
允許允許
允許已提交讀取(read committed)
不允許允許
允許可重複讀取(repeatable read)
不允許不允許
允許序列化(rerializable)
不允許不允許
不允許
oracle 支援三種事務隔離級別:已提交讀取,序列化,以及 sql92 中沒有包含的唯讀模式(read-only mode)。已提交讀取是 oracle 預設使用的事務隔離級別。
oracle 查詢當前正在執行的事務
select s.sid,s.serial s.event,a.sql text,a.sql fulltext,s.username,s.status,s.machine,s.terminal,s.program,a.executions,s.sql id,p.spid,a.direct write...
oracle唯讀事務
一致性讀是oracle區別於其他資料庫的重要特點之一,但一般來說,這個一致性讀是sql級別的,只針對單個sql有效。由於業務邏輯需要,我們可能需要在乙個事務中的多個sql也能實現讀一致性,也就是說,資料來源在事務開始時就定下來了,不受其他會話影響。oracle的唯讀事務可以實現這個功能,它可以在事務...
Oracle中事務的認識
事務 事務 transaction 是對資料庫的若干操作組成的乙個執行單元。這些操作要麼全部執行,要麼都取消,從而保證了資料庫滿足一致性的要求 通常,事務是有一組sql語句組成,包括查詢語句和 dml 資料操縱語句 data manipulationlanguage 語句。當然,事務也可以是乙個sq...