Spring JDBCを使用した簡単なトランザクション?
-
06-07-2019 - |
質問
Spring IoC およびJDBCテンプレートクラスを使用するJavaアプリで作業しています。 4つのメソッドを持つDAOクラスがあります:m1()からm4()。 m1は、テーブルt1で複数の挿入と更新を実行し、テーブルt2でm2、t3でm3などを実行します。
DAOメソッドは次のように使用されます。
while(true)
{
//process & generate data
dao.m1(data1);
dao.m2(data2);
dao.m3(data3);
dao.m4(data4);
//sleep
}
4つの連続したメソッド呼び出しの下でのdb操作をアトミックにし、4つのテーブルすべてが正常に更新されるか、まったく更新されないようにします。したがって、m3()で操作を実行中にエラーが発生した場合、m2&で実行されたすべての変更(更新&挿入)をロールバックします。 m1。
では、Springでは次のようにできますか?
while (true)
{
//process & generate data
transaction = TransactionManager.createNewTransaction();
transaction.start()
try
{
dao.m1(data1);
dao.m2(data2);
dao.m3(data3);
dao.m4(data4);
}
catch(DbUpdateException e)
{
transaction.rollBack();
}
transaction.end();
// sleep
}
またはそれを行うより良い方法はありますか?
解決
完全を期すため、プログラムによる解決策は次のとおりです。
private TransactionTemplate transactionTemplate;
public setTransactionManager(PlatformTransactionManager transactionManager) {
this.transactionTemplate = new TransactionTemplate(transactionManager);
}
...
while (true) {
transactionTemplate.execute(new TransactionCallbackWithoutResult() {
protected void doInTransactionWithoutResult(TransactionStatus status) {
try {
dao.m1(data1);
dao.m2(data2);
dao.m3(data3);
dao.m4(data4);
} catch(DbUpdateException e) {
status.setRollbackOnly();
}
}
});
}
他のヒント
はいSpringではプログラムでトランザクションを制御できます。
個人的には、アノテーションを使用して宣言型トランザクションを好む、次のようになります:
public void runBatchJob() {
while (true) {
// generate work
doWork(unitOfWork);
}
}
@Transactional
private void doWork(UnitOfWork work) {
dao.m1(data1);
dao.m2(data2);
dao.m3(data3);
dao.m4(data4);
}
DAO関数が定義されている場所:
@Transactional
public void m1(Data data) {
...
}
これは、 applicationContext.xml で必要です:
<tx:annotation-driven/>
宣言型トランザクションは、トランザクションの要求、新しいトランザクションの要求、トランザクションのサポートなどを宣言できます。 @Transactional
アノテーションが付けられたブロックが RuntimeException
をスローすると、ロールバックが発生します。 。
はい、これらの呼び出しをメソッド内に入れてトランザクションを指定できます宣言的に。
そのコードを追加する必要はありません。Springで追加できます。
Springは、説明どおり@Transactionalを使用するか、必要に応じてXMLでこれをすべて処理できます。
適切にインポートするものは、アプリケーションに依存する Transaction Propagation のタイプです。
デフォルトでは、トランザクションは存在しない場合は開始され、既に開始されている場合は既存のトランザクションを再利用します。これは、4つのDAOをすべてアトミックにする場合に必要な動作です。
(MyService)と呼ばれるDAOメソッドを管理するクラスに@Transactionalを配置します。このレイヤーの下にあるものはすべて、そのトランザクション境界に参加します。
i.e:
@Transactional
public void m1(Data data) {
...
}
@Transactional
public void m2(Data data) {
...
}
コードでこれを行うことは完全に不要です。