質問

Spring Docs をするトランザクション伝播プロパティを記述する素晴らしい仕事

しかし、私は、レイマンの用語でこれらのプロパティのそれぞれをより徹底的に説明する、よく知られている実世界の例があるかどうか疑問に思いましたか?

役に立ちましたか?

解決

propagation_required

class Service {
    @Transactional(propagation=Propagation.REQUIRED)
    public void doSomething() {
        // access a database using a DAO
    }
}
.

呼び出し側が既にトランザクションを起動していない場合、それは新しいトランザクションを開始します。

このメソッドの呼び出し元がすでにトランザクションを開始している場合、発信者のトランザクションが使用され、新しいトランザクションは作成されません(すなわち、Playに1つのトランザクションがある)。

DoSomething()の内部に例外がスローされている場合はロールバックされます。つまり、呼び出し元はトランザクションがロールバックされているのを見ることを意味します。

Dosomething()が返されたとき、トランザクションはまだコミットされませんでした。トランザクションをコミットする発信者です(またはおそらくロールバック)。

propagation_requires_new

class Service {
    @Transactional(propagation=Propagation.REQUIRES_NEW)
    public void doSomething() {
        // access a database using a DAO
    }
}
.

DOSOMECHET()が呼び出されると、常にの新しいトランザクションを開始します。

このメソッドの呼び出し元がすでにトランザクション(txnouter)を開始している場合、呼び出し元のトランザクションは suspended です。新しいトランザクション(Txninner)が作成されます(つまり、Playには2つのトランザクションがあります)。

DoSomething()内に例外がスローされている場合、Txninnerはロールバックされますが、発信者からの「中断」トランザクション(TXNOUTER)は影響を受けません。

dosomething()が例外なしで戻ると、トランザクション(Txninner)をコミットします。発信者のトランザクション(TXNOUTER)は再開され、別のトランザクションがコミットされたことを認識されません。それは、それが合うように見えるように呼び出し側をコミットまたはロールバックすることができます。

注意事項注意事項は、データベースビューTXNOUTERとTXNINNERが完全に独立したトランザクションとして、したがって2つの独立したコミットをコミットすることです。

propagation_nested

class Service {
    @Transactional(propagation=Propagation.NESTED)
    public void doSomething() {
        // access a database using a DAO
    }
}
.

ネストしたJDBCドライバやデータベースがサポートされている場合にのみ使用できます。 >

呼び出し側が既にトランザクションを起動していない場合、それは新しいトランザクションを開始します。

このメソッドの呼び出し元がすでにトランザクションを開始している場合、呼び出し元のトランザクションが使用され、新しいトランザクションは作成されません(すなわち、1つのトランザクションがある)。ただし、dosomething()が入力されたときに「セーブポイント」はトランザクションにマークされています。

DoSomething()内に例外がスローされた場合、トランザクションはトランザクションを "SavePoint"にロールバックすることができます。発信者はトランザクションを続行します。

Dosomething()が例外なしで戻ると、トランザクション全体(またはロールバック)をコミットする発信者です。

注意事項は、データベースが1つのトランザクションのみを見て、コミットが1つしかないことです。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top