私は、マスターディテールの構成UserとEmployeeに2つのテーブルを持っています(これは、Employeeがユーザーのタイプであり、他のタイプのユーザーがいるためです)。ユーザーがシステムに追加されると、多くの場合、従業員に詳細を追加する必要があります。これらのテーブルを更新する場合も同様です。つまり、これらの2つの操作(挿入と更新)のアトミック性を保証する必要があります。プロシージャを呼び出すときのPL/SQLトランザクション
1つの要件は、格納されたパッケージとプロシージャを使用して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