JavaWebプロジェクトの開発を通じて、トランザクションは、アプリケーションを開発するために使用されるネットワークの信頼性の最も重要な部分です。バックエンドリソースとアプリケーションの相互作用は、トランザクションはバックエンドリソースがデータベースを含む場合には、使用される場合は、MQ、ERPとのそう。データベーストランザクションは、最も一般的なタイプであり、我々は多くの場合、トランザクションは、トランザクションがあると言う狭い意味でのリレーショナルデータベースと対話しています。
サービスは、地元の情勢や世界的な情勢に分かれています。また、分散トランザクション、アプリケーションが単一のデータベース・リソース事務に接続されているローカルトランザクションとして知られているグローバル・トランザクションは、また、この培養の主な内容について議論しました。
まず、いくつかの基本的な概念情勢
不動産取引(ACID):
- 不可分性
- 一貫性
- 隔離
- 持久性
方言の「トランザクション」
:業務(またはプロセス)の三つの状態があり、コミット、ロールバックを開始しますが。
このようなシナリオがあるとします張とLiは、ジョー・スミスDoeのスイッチに10元を与えるために、1日、100を持っています。
現在のマイクロチャネル転送に相当、張は$ 10に転送ジョン・ドウに行われました。3つの状態があります。
その上、不適切な場所の例があるである、ジョン・ドウは$ 10のジョー・スミスは$ 10に減少し、されたことが何も操作しない場合でも、この矛盾情勢、我々はジョン・ドウが受信または$ 10返さないことをふりをすると、ジョンの財布だけでなく、マイクロチャネル100。しかし、マイクロ手紙、人々の相互転送で非常に多くありますが、すべての転送は、それは我々がこれらの問題を分離することが不可欠である取引されたが、それは持っているさまざまな分離レベル(下記参照)
トランザクション分離レベル
分離レベル | 説明 | 例えば |
---|---|---|
デフォルト | 基礎となるデータベース・ストレージのデフォルトの分離レベル | |
READ_UNCOMMITTED | 隔離の最低レベル、他のトランザクションが、将来的に提出されたデータを読み取ることができますので、それは重要なことを言うことができません | 上記の例、ジョン・ドウも10元を受け取っていない、他の人はジョン・ドウ以上の10元に読むことができます。 |
READ_COMMITTED | データベースのほとんどのデフォルトのレベルは、それが他のトランザクションが別のトランザクションからデータを読み取ることができることを保証し提出しました | 場合にのみ、ジョン・ドウ10元この操作(受信またはリターン)、他の人は、これら二つのバランスの変化を見ることができます。 |
REPEATABLE_READ | 以前よりも厳しいが、それは他のトランザクションは、このデータに変更を加える場合は、データを選択した後、新しいデータを選択できるようになります。 | トップは、トランザクションのコミット前に、ジョー・スミスは、常に自分自身の唯一の100元を考え、ジョー・スミスと他の人が$ 10有効にする場合でも、転送プロセスです。しかし、このタイプの転写プロセスにおけるジョー・スミスは、彼らが110元を持っていることが分かります |
SERIALIZABLE | 直列化、そのため、すべてのトランザクション一つずつ実行によって、最も厳しいと最も信頼性の高い分離レベルです | システムは、一人一人が、トランザクションの転送を実行することができ、任意の間違いがありません(もちろん、ここでは重要であるのみならず、この取引の移転をいいます。) |
取引のスプレッドタイプ
これは、現在のメカニズムと取引が始まった時点でどのように多くの人々の同等の間のマイクロチャネル転送がなければなりません
コミュニケーションの種類 | 説明 |
---|---|
PROPAGATION_REQUIRED | トランザクションが新しいトランザクションを作成していない場合は、トランザクションがすでに存在する場合、トランザクションに加えます。 |
PROPAGATION_SUPPORTS | 何のトランザクションが非トランザクションの方法で実行されない場合は、現在のトランザクションをサポートしています。 |
PROPAGATION_MANDATORY | トランザクションが、例外をスローしない場合は、現在のトランザクションを使用します。 |
PROPAGATION_REQUIRES_NEW | 新しいトランザクション、現在のトランザクションが存在する場合、現在のトランザクション保留中です。 |
PROPAGATION_NOT_SUPPORTED | 現在のトランザクションが存在する場合、非トランザクションように動作を行う、現在保留中のトランザクションを残します。 |
PROPAGATION_NEVER | 現在のトランザクションが存在する場合は、非トランザクションの方法を実行するには、例外がスローされます。 |
PEOPAGATION_NESTED | 現在のトランザクションが存在する場合は、トランザクションが持ち逃げ内で実行されます。いいえ取引した場合、PROPAGATION_REQUIREDアンティル動作が行われます。 |
二、春の業務の問題を解決します
:春の2種類で業務を問題解決宣言的トランザクションおよびプログラムによるトランザクション(推奨されません)
トランザクショナルインターフェイスでの春は最低レベルであるPlatformTransactionManager
が、我々が使用するだけでそのサブクラス
public interface PlatformTransactionManager {
//获取事务状态
TransactionStatus getTransaction(@Nullable TransactionDefinition var1) throws TransactionException;
//提交
void commit(TransactionStatus var1) throws TransactionException;
//回滚
void rollback(TransactionStatus var1) throws TransactionException;
}
メインとTransactionDefinition TransactionStatus二つのクラスとのインタフェース。興味はで見ることができます。これは、そのサブクラス図の下で、我々はここで使用にかかわらず、使用は、PlatformTransactionManagerこのサブクラスのインターフェイスを持っていなければならない方法の、トランザクション管理クラスとしてDataSourceTransactionManagerです。
1.宣言的トランザクション
-
注釈を使用します
次のようにコンフィギュレーションファイルは、次のとおりです。
<!--引入公共的配置文件-->
<import resource="application-context.xml"/>
<!--Spring提供的事务管理器-->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<constructor-arg ref="dataSource"/>
</bean>
<!--
开启事务注解
这里有个小技巧,如果你的事务管理bean名不是transactionManager
就要给这个标签配置transaction-manager来指定
-->
<tx:annotation-driven/>
<!-- 配置spring扫描注解注入service类-->
<context:component-scan base-package="cn.lyn4ever.service"/>
その後、クラスやメソッド缶にこの@Transactional注釈を追加
@Transactional
public void insertOne(){
Store store =new Store();
store.setTitle("华为P30");
storeMapper.insertOne(store);
int j = 10/0;//指定报错,让事务回滚
}
- 使用AOPの設定
使用AOPは、我々はあなたが私たちのビジネスコードに任意の侵入せずに書くことができ、設定する必要があります。AOPの知識は非常に理解していない場合は、私の前のチュートリアルシリーズAOPを参照することができます春の研究ノート、AOPはまた、種々の構成、AOPの名前空間を直接使用しています
<import resource="application-context.xml"/>
<!--Spring提供的事务管理器-->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<constructor-arg ref="dataSource"/>
</bean>
<tx:advice id="txAdvice">
<tx:attributes>
<!-- 对单独方法配置属性-->
<tx:method name="insert*" rollback-for="java.lang.Exception"/>
<tx:method name="*"/>
</tx:attributes>
</tx:advice>
<aop:config>
<aop:pointcut id="serviceTrans" expression="execution(* cn.lyn4ever.serviceaop.*.*(..))"/>
<aop:advisor advice-ref="txAdvice" pointcut-ref="serviceTrans"/>
</aop:config>
<!-- 配置spring扫描注解注入service类-->
<context:component-scan base-package="cn.lyn4ever.serviceaop"/>
- 上記の2つの方法がコントラスト:
- いないすべてのサービスメソッドが業務を必要とするため、使用注釈は、よりきめ細かく制御することができます。AOPを使用してプログラミング指向大量に制御することができ、使用されるが、切断にサービス層に一般的。
- 使用注釈の単語、簡単な構成、AOPの何かもう少し複雑な構成が。
- それは、新しいプロジェクトであれば、最初から提案が注釈型開発を使用します。トランザクションが使用されていない場合は変更前、または使用AOPを構築し、ソースコードを変更できずにプロジェクト(一般的に、プログラマが乾燥してないだろう成熟)。
- 個人的な経験が、各メソッドとクラスを設定するための柔軟性を注釈開発を使用することをお勧めします。AOPの使用は、時にはそれはあなたがサービスメソッド間で内容をデバッグする場合は、AOP通知方法、トラブルの多くを入力します、便利なデバッグではありません。
2.プログラムによるトランザクション
名前が示すように、それは何をする最も簡単なので、そのサービス事業のコードの動作に直接書き込むことがあるが、ほとんどはお勧めしません。PlatformTransactionManagerはそれを使用するために、豆の中に注入するための一つの例では、2つの方法があります。もう一つは、TransactionTemplate春は私たちを提供して使用することです。ここでは、直接第二に、この時間を使用し、我々はこれら2つのクラスを注入するの春とのTransactionManagerを使用する必要がありますが、順番に以前の設定を混同して、私は、プログラムによるトランザクションの使用であること、新たに2つのオブジェクトを指示するではありません、のみこれらの2つのオブジェクトが十分にある、任意の他の構成関連事項を必要としない、唯一のデータソース
@Autowired
private DataSource dataSource;
@Test
public void fun() {
DataSourceTransactionManager transactionManager = new DataSourceTransactionManager();
//设置数据源,这个数据源的bean是由Spring提供的
transactionManager.setDataSource(dataSource);
TransactionTemplate transactionTemplate = new TransactionTemplate(transactionManager);
transactionTemplate.execute(txStatus -> {
Store store = new Store();
store.setTitle("小米11");
storeMapper.insertOne(store);
//制造错误,让事务回滚
int i = 10 / 0;
return null;
});
}
マイクロチャネル公共番号「小魚とJava」に焦点を当て、春には、コードの返信アドレスを取得し、それ以上の材料を学びます