Oracle事務的執行1

2021-07-23 19:08:06 字數 1635 閱讀 9374

初始資料表資料

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...