Spring トランザクションの概念を理解しようとしています。以下に示すように、2 つの異なるデータベース (iSeries と DB2) にデータを挿入する必要がありますが、iSeries バージョンは 2 フェーズ コミットをサポートしていません。要件は、両方の挿入が成功した場合にのみトランザクションをコミットする必要があり、それ以外の場合はロールバックする必要があることです。
Propagation を REQUIRED または REQUIRES_NEW として使用すると、「既存の 2 フェーズ対応リソースで 1 フェーズ対応リソースをコミットしようとする不正な試みが発生しました」というエラーが表示されます。
しかし、NOT_SUPPORTED または SUPPORTS を使用すると、正常に動作します (つまり、挿入の 1 つが失敗した場合、トランザクションはロールバックし、そうでない場合は、両方の挿入が成功した場合にコミットします)。
私の理解では、Propagation = SUPPORTS / NOT_SUPPORTED の場合、以下のシナリオではトランザクションは開始されません。したがって、2 つの異なるデータベースで両方の挿入が独立して発生する可能性があり、いずれかが失敗した場合、トランザクション全体がロールバックされるべきではありません。
しかし、 Propagation = SUPPORTS / NOT_SUPPORTED は私の要件に従って機能します。誰かがこれを説明できますか?前もって感謝します。
@Resource
private SessionFactory db2SessionFactory = null;
@Resource
private SessionFactory iSeriesSessionFactory = null;
@Transactional(propagation = Propagation.REQUIRED)
public void insert()
{
insertDB1();
insertDB2();
}
insertDB1()
{
db2SessionFactory .getCurrentSession().saveOrUpdate(obj1);
}
insertDB2()
{
iSeriesSessionFactory.getCurrentSession().saveOrUpdate(obj2);
}