Springトランザクション管理の実現方法:プログラミングトランザクションと宣言トランザクション
本文は本人の別のブログに転載した.http://blog.csdn.net/liaohaojian/article/details/70139151】
1.前の記事ではSpringトランザクションの伝播レベルと独立性レベル、および分散トランザクションの簡単な構成について説明しています.
2.プログラミングトランザクション:コーディング方式でトランザクション管理を実現する(コードプレゼンテーションはJDBCトランザクション管理)
Springはプログラミングトランザクションを実現し,2つのクラスに依存し,それぞれ前述のPlatformTransactionManagerとテンプレートクラスTransactionTemplate(推奨)である.Springがこのクラスでトランザクション管理を実現する方法については、それぞれ詳しく説明します.
1)PlatformTransactionManager,前編では,このクラスが持つ方法について詳しく解説したが,前編を見返すことは覚えていない.
トランザクションマネージャの構成
ビジネスでコードを使用する(クラスの表示をテストする)
2)TransactionTemplateを使用します.このクラスは、トランザクション管理をシンプル化するためのインタフェースD u l t TransactionDefinitionを継承します.トランザクション管理はテンプレートクラスによって定義されます.主にTransactionCallbackコールバックインタフェースまたはTransactionCallbackWithoutResultコールバックインタフェースによって指定されます.テンプレートクラスのパラメータタイプがTransactionCallbackまたはTransactionCallbackWithoutResultのexecuteメソッドを呼び出すことによって、動的享受トランザクション管理が行われます.
TransactionTemplateテンプレートクラスで使用されるコールバックインタフェース: TransactionCallback:このインタフェースの「T doInTransaction(TransactionStatus status)」メソッドを実装することによって、トランザクション管理が必要なオペレーティングコードを定義します. TransactionCallback WithoutResult:TransactionCallbackインタフェースを継承し、「void doInTransactionWithoutResult(TransactionStatus status)」便利なインタフェースを提供し、値を返す必要のないトランザクション・オペレーション・コードを便利にします.
テストクラスで実装方法を示します
3.声明式事務:プログラム式事務は毎回単独で実現しなければならないことが分かるが、業務量が多くて機能が複雑な場合、プログラミング式事務を使用するのは間違いなく苦痛であるが、音声式事務は異なり、声明式事務は侵入式がなく、業務ロジックの実現に影響しない.
宣言型トランザクション実装方式は主に2種類あり、Springの定義トランザクション通知を使用してAOP関連構成を実装するものと、@Transactionalによるトランザクション管理実装を実装するもので、2つの方法の構成方法について詳しく説明します.
1)方式一、プロファイルは以下の通り
トランザクションの伝播動作と独立性レベルについては、を参照してください.http://blog.csdn.net/liaohaojian/article/details/68488150
注意点:トランザクションロールバック異常はRuntimeException異常のみであり、Checked Exception異常はロールバックせず、キャプチャ異常は投げ出さずロールバックもしないが、トランザクションロールバックを強制することができる:TransactionAspectSupport.currentTransactionStatus().isRollbackOnly(); 自己呼び出しによる適切なトランザクション属性の設定ができない問題を解決するには、「」を参照してください.http://www.iteye.com/topic/1122740
2)方式2@Transactionalによるトランザクション管理
@Transactional(propagation=Propagation.REQUIRD,isolation=Isolation.READ_COMMITTED)具体的なパラメータは上記と同じです
Springが提供する@Transaction注記トランザクション管理は、内部でも同様に、内部では、トランザクションのオン/オフをループ通知TransactionInterceptorで実現します.@Transactionalの使用上の注意点:インタフェース、インプリメンテーションクラス、またはメソッドに@Transactional注釈が指定されている場合、優先順位はメソッド>インプリメンテーションクラス>インタフェースである. は、JDKエージェントメカニズム(インタフェースベースのエージェント)を使用する場合は問題ないため、インタフェースで使用するのではなく、クラスまたはクラスを実装する方法でのみ@Transactionalを使用することを推奨する.一方、CGLIBエージェント(継承)メカニズムを使用すると、インタフェースではなくクラスベースのエージェントを使用するため、問題が発生します.これは、インタフェース上の@Transactional注釈が「継承できない」ためです.
1.前の記事ではSpringトランザクションの伝播レベルと独立性レベル、および分散トランザクションの簡単な構成について説明しています.
2.プログラミングトランザクション:コーディング方式でトランザクション管理を実現する(コードプレゼンテーションはJDBCトランザクション管理)
Springはプログラミングトランザクションを実現し,2つのクラスに依存し,それぞれ前述のPlatformTransactionManagerとテンプレートクラスTransactionTemplate(推奨)である.Springがこのクラスでトランザクション管理を実現する方法については、それぞれ詳しく説明します.
1)PlatformTransactionManager,前編では,このクラスが持つ方法について詳しく解説したが,前編を見返すことは覚えていない.
トランザクションマネージャの構成
5
30
10
60
5
0
60
30
true
false
ビジネスでコードを使用する(クラスの表示をテストする)
import java.util.Map;
import javax.annotation.Resource;
import javax.sql.DataSource;
import org.apache.log4j.Logger;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4Cla***unner;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.TransactionDefinition;
import org.springframework.transaction.TransactionStatus;
import org.springframework.transaction.support.DefaultTransactionDefinition;
@RunWith(SpringJUnit4Cla***unner.class)
@ContextConfiguration(locations = { "classpath:spring-public.xml" })
public class test {
@Resource
private PlatformTransactionManager txManager;
@Resource
private DataSource dataSource;
private static JdbcTemplate jdbcTemplate;
Logger logger=Logger.getLogger(test.class);
private static final String INSERT_SQL = "insert into testtranstation(sd) values(?)";
private static final String COUNT_SQL = "select count(*) from testtranstation";
@Test
public void testdelivery(){
// , ,
DefaultTransactionDefinition def = new DefaultTransactionDefinition();
def.setIsolationLevel(TransactionDefinition.ISOLATION_READ_COMMITTED);
def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);
// , PlatformTransactionManager getTransaction ; ,Spring
TransactionStatus status = txManager.getTransaction(def);
jdbcTemplate = new JdbcTemplate(dataSource);
int i = jdbcTemplate.queryForInt(COUNT_SQL);
System.out.println(" :"+i);
try {
jdbcTemplate.update(INSERT_SQL, "1");
txManager.commit(status); // status
} catch (RuntimeException e) {
txManager.rollback(status); //
}
i = jdbcTemplate.queryForInt(COUNT_SQL);
System.out.println(" :"+i);
}
}
2)TransactionTemplateを使用します.このクラスは、トランザクション管理をシンプル化するためのインタフェースD u l t TransactionDefinitionを継承します.トランザクション管理はテンプレートクラスによって定義されます.主にTransactionCallbackコールバックインタフェースまたはTransactionCallbackWithoutResultコールバックインタフェースによって指定されます.テンプレートクラスのパラメータタイプがTransactionCallbackまたはTransactionCallbackWithoutResultのexecuteメソッドを呼び出すことによって、動的享受トランザクション管理が行われます.
TransactionTemplateテンプレートクラスで使用されるコールバックインタフェース:
テストクラスで実装方法を示します
@Test
public void testTransactionTemplate(){
jdbcTemplate = new JdbcTemplate(dataSource);
int i = jdbcTemplate.queryForInt(COUNT_SQL);
System.out.println(" :"+i);
// TransactionTemplate
TransactionTemplate template = new TransactionTemplate(txManager);
template.setIsolationLevel(TransactionDefinition.ISOLATION_READ_COMMITTED);
// execute
template.execute(new TransactionCallbackWithoutResult() {
@Override
protected void doInTransactionWithoutResult(TransactionStatus status) {
jdbcTemplate.update(INSERT_SQL, " "); // sd int , , , TransactionTemplate
}}
);
i = jdbcTemplate.queryForInt(COUNT_SQL);
System.out.println(" :"+i);
}
3.声明式事務:プログラム式事務は毎回単独で実現しなければならないことが分かるが、業務量が多くて機能が複雑な場合、プログラミング式事務を使用するのは間違いなく苦痛であるが、音声式事務は異なり、声明式事務は侵入式がなく、業務ロジックの実現に影響しない.
宣言型トランザクション実装方式は主に2種類あり、Springの定義トランザクション通知を使用してAOP関連構成を実装するものと、@Transactionalによるトランザクション管理実装を実装するもので、2つの方法の構成方法について詳しく説明します.
1)方式一、プロファイルは以下の通り
トランザクションの伝播動作と独立性レベルについては、を参照してください.http://blog.csdn.net/liaohaojian/article/details/68488150
注意点:
2)方式2@Transactionalによるトランザクション管理
//
@Transactional(propagation=Propagation.REQUIRD,isolation=Isolation.READ_COMMITTED)具体的なパラメータは上記と同じです
Springが提供する@Transaction注記トランザクション管理は、内部でも同様に、内部では、トランザクションのオン/オフをループ通知TransactionInterceptorで実現します.@Transactionalの使用上の注意点: