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

Oracle數(shù)據(jù)庫(kù)事務(wù)的開(kāi)啟與結(jié)束詳解

 更新時(shí)間:2022年06月23日 10:42:14   作者:喝醉酒的小白  
事務(wù)是一個(gè)整體,這些操作要么全部執(zhí)行成功,要么全部不執(zhí)行,下面這篇文章主要給大家介紹了關(guān)于Oracle數(shù)據(jù)庫(kù)事務(wù)的開(kāi)啟與結(jié)束的相關(guān)資料,文中通過(guò)圖文介紹的非常詳細(xì),需要的朋友可以參考下

前言

Oracle的事務(wù)開(kāi)始于一個(gè)DML語(yǔ)句。

當(dāng)以下情況發(fā)生時(shí),事務(wù)結(jié)束:

1、COMMIT/ROLLBACK

2、執(zhí)行了DDL/DCL語(yǔ)句

3、客戶端主動(dòng)斷開(kāi)數(shù)據(jù)庫(kù)的連接(DISCONNECT)

4、數(shù)據(jù)庫(kù)關(guān)閉(宕機(jī))

另外,一個(gè)DDL/DCL語(yǔ)句實(shí)際上就是一個(gè)事務(wù),其中隱含了COMMIT。

Oracle不需要特別的去指定事務(wù)的開(kāi)始和結(jié)束。一個(gè)事務(wù)的結(jié)束就是下一個(gè)事務(wù)的開(kāi)始。

事務(wù)是用來(lái)分割數(shù)據(jù)庫(kù)活動(dòng)的邏輯工作單元。事務(wù)既有起點(diǎn),也有終點(diǎn):當(dāng)發(fā)生下列事件時(shí),事務(wù)就開(kāi)始了:

1.連接到數(shù)據(jù)庫(kù)上,并執(zhí)行第一條DML語(yǔ)句

2.前一個(gè)事務(wù)結(jié)束后,又輸入另外一條DML語(yǔ)句

在下列事件之一發(fā)生時(shí),事務(wù)就結(jié)束了:

1.執(zhí)行Commit或者RollBack語(yǔ)句

2.執(zhí)行一條DDL語(yǔ)句,例如Create Table語(yǔ)句;在這種情況下,會(huì)自動(dòng)執(zhí)行Commit語(yǔ)句

3.執(zhí)行一條DCL語(yǔ)句,例如Grant語(yǔ)句;在這種情況下,會(huì)自動(dòng)執(zhí)行Commit語(yǔ)句

4.斷開(kāi)與數(shù)據(jù)庫(kù)鏈接。在退出SQLPlus事,通常會(huì)輸入EXit命令,此時(shí)會(huì)自動(dòng)執(zhí)行Commit語(yǔ)句。如果SQLPlus被意外終止(例如運(yùn)行SQL*Plus的計(jì)算機(jī)崩潰)那么就會(huì)執(zhí)行RollBack語(yǔ)句

事務(wù)完成后,如果不顯式的提交或者回滾事務(wù),都被認(rèn)為是不好的編程習(xí)慣,因此確保在每個(gè)事物后面都要執(zhí)行Commit或者RollBack語(yǔ)句。

事務(wù)中任何地方都可以設(shè)置一個(gè)保存點(diǎn)(savepoint),這樣可以將修改回滾到保存點(diǎn)處。

commit

create table  transaction_table8 as select * from dba_objects;
insert into transaction_table8 select * from transaction_table8;

select xid, status from v$transaction;

Truncate – DDL


select xxx for update

select * from transaction_table8 where rownum=1 for update;

select…for update使用方法

作用:

select for update 是為了在查詢時(shí),避免其他用戶以該表進(jìn)行插入,修改或刪除等操作,造成表的不一致性.

給你舉幾個(gè)例子:

select * from t for update 會(huì)等待行鎖釋放之后,返回查詢結(jié)果。
select * from t for update nowait 不等待行鎖釋放,提示鎖沖突,不返回結(jié)果
select * from t for update wait 5 等待5秒,若行鎖仍未釋放,則提示鎖沖突,不返回結(jié)果
select * from t for update skip locked 查詢返回查詢結(jié)果,但忽略有行鎖的記錄

SELECT...FOR UPDATE 語(yǔ)句的語(yǔ)法如下:

  SELECT ... FOR UPDATE [OF column_list][WAIT n|NOWAIT][SKIP LOCKED];

其中:

  OF 子句用于指定即將更新的列,即鎖定行上的特定列。

  WAIT 子句指定等待其他用戶釋放鎖的秒數(shù),防止無(wú)限期的等待。

“使用FOR UPDATE WAIT”子句的優(yōu)點(diǎn)如下:

  1防止無(wú)限期地等待被鎖定的行;

  2允許應(yīng)用程序中對(duì)鎖的等待時(shí)間進(jìn)行更多的控制。

  3對(duì)于交互式應(yīng)用程序非常有用,因?yàn)檫@些用戶不能等待不確定

  4 若使用了skip locked,則可以越過(guò)鎖定的行,不會(huì)報(bào)告由wait n 引發(fā)的‘資源忙’異常報(bào)告

補(bǔ)充幾點(diǎn):

分成兩類:加鎖范圍子句和加鎖行為子句

加鎖范圍子句:在select…for update之后,可以使用of子句選擇對(duì)select的特定數(shù)據(jù)表進(jìn)行加鎖操作。默認(rèn)情況下,不使用of子句表示在select所有的數(shù)據(jù)表中加鎖

加鎖行為子句:當(dāng)我們進(jìn)行for update的操作時(shí),與普通select存在很大不同。一般select是不需要考慮數(shù)據(jù)是否被鎖定,最多根據(jù)多版本一致讀的特性讀取之前的版本。加入for update之后,Oracle就要求啟動(dòng)一個(gè)新事務(wù),嘗試對(duì)數(shù)據(jù)進(jìn)行加鎖。如果當(dāng)前已經(jīng)被加鎖,默認(rèn)的行為必然是block等待。使用nowait子句的作用就是避免進(jìn)行等待,當(dāng)發(fā)現(xiàn)請(qǐng)求加鎖資源被鎖定未釋放的時(shí)候,直接報(bào)錯(cuò)返回。

在日常中,我們對(duì)for update的使用還是比較普遍的,特別是在如pl/sql developer中手工修改數(shù)據(jù)。此時(shí)只是覺(jué)得方便,而對(duì)for update真正的含義缺乏理解。

For update是Oracle提供的手工提高鎖級(jí)別和范圍的特例語(yǔ)句。Oracle的鎖機(jī)制是目前各類型數(shù)據(jù)庫(kù)鎖機(jī)制中比較優(yōu)秀的。所以,Oracle認(rèn)為一般不需要用戶和應(yīng)用直接進(jìn)行鎖的控制和提升。甚至認(rèn)為死鎖這類鎖相關(guān)問(wèn)題的出現(xiàn)場(chǎng)景,大都與手工提升鎖有關(guān)。

所以,Oracle并不推薦使用for update作為日常開(kāi)發(fā)使用。而且,在平時(shí)開(kāi)發(fā)和運(yùn)維中,使用了for update卻忘記提交,會(huì)引起很多鎖表故障。 那么,什么時(shí)候需要使用for update?就是那些需要業(yè)務(wù)層面數(shù)據(jù)獨(dú)占時(shí),可以考慮使用for update。場(chǎng)景上,比如火車票訂票,在屏幕上顯示郵票,而真正進(jìn)行出票時(shí),需要重新確定一下這個(gè)數(shù)據(jù)沒(méi)有被其他客戶端修改。所以,在這個(gè)確認(rèn)過(guò)程中,可以使用for update。這是統(tǒng)一的解決方案方案問(wèn)題,需要前期有所準(zhǔn)備。

失敗的DML 和 exit

DCL

總結(jié) 

到此這篇關(guān)于Oracle數(shù)據(jù)庫(kù)事務(wù)的開(kāi)啟與結(jié)束的文章就介紹到這了,更多相關(guān)Oracle事務(wù)開(kāi)啟與結(jié)束內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評(píng)論