我在主 - 細節組合中有兩個表,User和Employee(這是因爲Employee是一種用戶類型,還有其他類型的用戶)。當用戶被添加到系統中時,在很多情況下,我還必須向Employee添加詳細信息,更新這些表時也會發生同樣的情況。這意味着我必須保證這兩個操作的原子性(插入和更新)。調用過程時的PL/SQL事務
一個要求是使用存儲的包和過程來執行CRUD(表從不直接使用)。
我寫在PL/SQL下面這個簡單的例子,試圖瞭解交易在這方面是如何工作的:
CREATE TABLE test_a
(
campo_1 VARCHAR2(10) NOT NULL
);
CREATE TABLE test_b
(
campo_2 VARCHAR2(10) NOT NULL
);
/
CREATE PROCEDURE ins_a
(
texto_1 IN VARCHAR2
)
IS
BEGIN
INSERT INTO test_a (campo_1)
VALUES (texto_1);
END;
/
CREATE PROCEDURE ins_b
(
texto_2 IN VARCHAR2
)
IS
BEGIN
INSERT INTO test_b (campo_2)
VALUES (texto_2);
END;
/
CREATE PROCEDURE ins_todos
(
texto_1 IN VARCHAR2,
texto_2 IN VARCHAR2
)
IS
BEGIN
ins_a(texto_1);
ins_b(texto_2);
END;
/
如果我運行
begin
ins_todos('alfa', '1234567846513216549');
end;
/
過程明顯失敗,因爲長度的第二個參數,但第一個過程不插入第一個參數,這讓我感到意外,因爲我預計第一個過程無論如何都會成功。
我的問題是:
- 這是因爲某處運行的隱性事務的?
- 如果是這樣,這是否讓我免於在我的PL/SQL代碼中顯式管理事務? (我仍然認爲我應該明確地使用代碼中的交易。)
- 如何確保在另一個過程中調用多個過程將尊重回滾和提交?我的目的是如果其中一個引發異常,所有內部過程必須回滾。
- 最後,我可以在PL/SQL中執行所有這些操作,還是需要在C#數據訪問層中對其進行管理?
'這是因爲隱式事務在某處運行,當你執行過程開始事務時。如果錯誤 - 數據庫回滾所有更改 – are