事務()
提交事務
COMMIT語句的功能是結束當前事務並使在事務期間對數據的所有修改永久保存在數據庫中對於原生支持事務的所有RDBMS提交事務的語法實際上都是相同的這也是SQL的標准提交事務的語法非常簡單
COMMIT [WORK]
盡管加上WORK這個關鍵字可以使語法更清晰但它並不是必需的一個簡單的COMMIT語句就可以完成提交事務的工作
某些RDBMS在COMMIT語句中添加了大量的附加選項例如一個Oracleg/g語法的簡單COMMIT語句如下所示
COMMIT [WORK] [COMMENT (<text>)[WRITE]] [FORCE (<text>) [<int>]] ;
可以使用COMMENT子句聲明一個注釋(最大長度為字節)用於記錄每一個懸而未決的事務可以通過DBA_PC_PENDING目錄視圖來查看這些注釋(關於系統目錄請參考本章隨後的內容)
IBM DB 中用於控制事務的語句在語法上遵循SQL標准在IBM的術語中事務就是一個工作單元(unit of workUOW)當對數據庫發出SQL語句時總是隱式地啟動一個事務發出語句時無需任何授權事務持有的全部鎖隨後都會被釋放IBM DB 並不支持對事務命名
除了Microsoft SQL Server和PostgreSQL之外對於本書討論的每一種數據庫下面的語法都是有效的之所以可以使用COMMIT提交事務是因為對於這些RDBMS來說事務是隱式啟動的
UPDATE books
SET bk_price =
WHERE bk_id=;
COMMIT;
只需COMMIT語句即可其他的選項都是可選的另外也可以使用COMMIT WORK語句該語法與COMMIT TRANSACTION的功能完全相同
數據庫中的數據並不會發生任何改變直到最後的COMMIT語句執行因此就可以回滾事務在提交事務的問題上各個RDBMS之間存在著顯著的差異例如在執行COMMIT命令時Microsoft SQL Server 必須已經隱式或顯式地啟動一個事務此時COMMIT才能夠執行成功否則如果沒有啟動事務發出COMMIT命令就會產生一個錯誤
Server: Msg Level State Line
The COMMIT TRANSACTION request has no corresponding BEGIN TRANSACTION
None of the other databases would complain no matter how many times you execute
COMMIT (though some like PostgreSQL might warn you that there are no pending
transactions to commit)
Microsoft SQL Server 使用了自己的語法來提交事務它不支持SQL標准的提交事務語法Microsoft的語法允許提交命名事務而SQL標准的語法不支持提交命名事務
COMMIT [ TRAN [ SACTION ] [<transaction name>]]
嵌套事務
對於嵌套事務來說命名的事務顯得特別方便嵌套事務背後的思想就是在一個事務中又包含了另外一個事務而該內部事務可能又包含了一個內部的事務(在每一種RDBMS實現中對於事務可以嵌套多少級都有一定的限制)每一個子事務都知道更高一級的父事務在本書討論的數據庫中只有Microsoft SQL Server 和PostgreSQL這兩種數據庫對嵌套事務提供了內置的支持
只有顯式事務才能進行嵌套在Microsoft SQL Server 中嵌套事務僅僅是為了提供代碼的可讀性提交一個內部事務並不會真正提交任何數據只有最外層的COMMIT語句才能向數據庫實際提交修改所有其他內部的事務的提交操作僅僅是對事務計數器進行遞減但是可以使用SAVEPOINT來回滾內部事務的修改
返回目錄SQL實戰新手入門
編輯推薦
Oracle索引技術
高性能MySQL
數據倉庫與數據挖掘培訓視頻教程
From:http://tw.wingwit.com/Article/program/SQL/201311/16449.html