這是一些元代碼:
procedure Processing1;
begin
// Here we do single operations like single INSERT
end;
procedure Processing2;
begin
// Here we do single operations like single SELECT
end;
procedure Processing3;
begin
// Here we do multiple DB operations
end;
procedure Processing4;
begin
// Here we do not touch the database at all
end;
procedure EntryPoint(ProcessingType: Integer);
begin
// It could be even a loop
StartTransaction;
try
case ProcessingType of
1: Processing1;
2: Processing2;
3: Processing3;
4: Processing4;
end;
CommitTransaction;
except
RollbackTransaction;
end;
end;
我可以將每個方法呼叫包裝在事務中還是只在需要時才使用事務?通用方法的開銷是多少?
uj5u.com熱心網友回復:
在甲骨文中:
交易的開始
當遇到第一個可執行的 SQL 陳述句時,事務就開始了。
可執行 SQL 陳述句是生成對資料庫實體的呼叫的 SQL 陳述句,包括 DML 和 DDL 陳述句以及該
SET TRANSACTION陳述句。當事務開始時,Oracle 資料庫將事務分配給可用的撤消資料段,以記錄新事務的撤消條目。在分配撤消段和事務表槽之前不會分配事務 ID,這發生在第一個 DML 陳述句期間。事務 ID 對事務來說是唯一的,表示撤消段號、槽和序列號。
[...]
交易結束
交易可以在不同的情況下結束。
當發生以下任何操作時,事務結束:
用戶發出不帶子句的
COMMITor陳述句。ROLLBACKSAVEPOINT在提交中,用戶顯式或隱式請求將事務中的更改永久化。事務所做的更改是永久性的,并且只有在事務提交后才對其他用戶可見。“示例交易:賬戶借記和貸記”中顯示的交易以提交結束。
用戶運行 DDL 命令,例如
CREATE、DROP、RENAME或ALTER。
COMMIT資料庫在每個 DDL 陳述句之前和之后發出一個隱式陳述句。如果當前事務包含 DML 陳述句,則 Oracle 資料庫首先提交事務,然后將 DDL 陳述句作為新的單陳述句事務運行并提交。用戶從大多數 Oracle 資料庫實用程式和工具中正常退出,導致當前事務被隱式提交。用戶斷開連接時的提交行為取決于應用程式且可配置。
客戶端行程例外終止,導致事務使用存盤在事務表和撤消段中的元資料隱式回滾。
至于你的問題:
我可以將每個方法呼叫包裝在事務中還是只在需要時才使用事務?
你可以做任何一個。
通用方法的開銷是多少?
對于每個事務,然后在事務結束時,您必須或者事務(通過適當的陳述句顯式或通過 DDL 陳述句隱式或終止連接)COMMIT。ROLLBACK如果你ROLLBACK那么事務實際上永遠不會發生,如果你COMMIT那么資料將從撤消/重做日志寫入資料庫檔案。
如果您有多個事務,每個事務都有單獨的陳述句,那么:
- 您將在撤消/重做日志中有多個小條目(與日志條目關聯的元資料將占據每個日志條目的更大比例)。
- 您將有多個
COMMITs,因此資料庫檔案上會有更多的 I/O 實體。 - 您不能
ROLLBACK在第二個陳述句出錯后的第一個陳述句,因為您將使用COMMIT第一個陳述句;如果陳述句是相關活動的鏈,那么如果鏈的一部分被提交而其余的被回滾,這可能會使您的業務流程處于無效狀態。 - 如果這些陳述句是必須保留的不相關活動,那么您可能希望
COMMIT在每一個之后都保留。
如果您有一個包含多個陳述句的事務,那么:
- 您將有一個較大的條目進入撤消/重做日志(并且與日志條目關聯的元資料將占每個日志條目的較小比例)。
- 您將擁有一個
COMMIT,因此資料庫檔案上將有一個 I/O 實體。 - 您可以將陳述句鏈接在一起,并
ROLLBACK在出現錯誤后將較早的陳述句與后面的陳述句連接起來;如果陳述句是一系列相關活動,那么這將允許您保留業務流程的原子性。
通常,您應該將陳述句分組到一個事務中,以便每個事務都代表一個業務流程,以便您可以ROLLBACK完成整個事務并使業務處于有效狀態。業務流程是什么以及它包含多少陳述句是每個業務流程獨立的東西,您需要評估它以獲得適合您業務的正確原子性。
uj5u.com熱心網友回復:
保持原子性很重要。如果 Processing2 依賴于 Processing1 的結果,請在同一個事務中執行 Processing1 和 Processing2。如果 Processing3 也依賴于 Processing2,請在同一個事務中執行 Processing1、Processing2、Processing3。如果出現問題,您可以回滾事務。有try-catch。如果資料 Processing1、Processing2、Processing3、Processing4 彼此不相關,則可以執行多個事務。
我想你明白了基本的想法。同樣重要的是不要長時間保持交易開放。這種方法不僅適用于 Oracle。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/522337.html
標籤:甲骨文德尔福交易
上一篇:元素組合2D陣列C
