春のサービス概要

トランザクション管理は、データの整合性と一貫性を確保するために不可欠な技術、エンタープライズクラスのアプリケーションの開発です。

春のトランザクション管理は、2つの方法で達成します:

プログラムによるトランザクション管理:コミットやロールバック、ビジネス・プロセスのトランザクションを制御するために埋め込まれたトランザクション管理コード、トランザクション管理プログラムは、各トランザクション操作のための追加のトランザクション管理コードに含まれている必要があります。

宣言型トランザクション管理(推奨):より良いプログラムによるトランザクション管理を使用するよりも、ほとんどのケースでは、トランザクション管理コードが事業から分離されますが、トランザクション管理を実装するために宣言して処理し、春の宣言的トランザクション管理は、AOPの上に構築されました基礎は、典型的な横断のその後の懸念、原理は切片に前と後の方法で、強化されたサラウンドを通じて達成され、対象の方法が始まる前に、トランザクションを作成したり、参加し、提出するかの実装に完成応じた後リターンですロールトランザクション次のように、モデルは次のとおりです。

public Object around(ProceedingJoinPoint joinPoint) throws Throwable {
	try {
		//开启事务
		return joinPoint.proceed();
		//提交事务
	} catch (Throwable e) {
		//回滚事务
		throw e;
	}finally {
		//释放资源
	}
}

宣言的トランザクションを実現する方法

図1に示すように、バネ側面-4.3.10.RELEASE.jar添加パケット

Spring構成ファイルを次のように2を加えました。

<!-- 配置事务管理器 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
	<property name="dataSource" ref="dataSource"></property>
</bean>

<!-- 启用事务注解 -->
<tx:annotation-driven transaction-manager="transactionManager"/>

 3、サービスのパブリックメソッドにトランザクション注釈レイヤーを追加 - トランザクション@

package com.jd.coupon.service;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import com.jd.book.dao.IBookDao;
import com.jd.coupon.dao.ICouponDao;
import com.jd.exception.MoneyException;
import com.jd.money.dao.IMoneyDao;

@Service
@Transactional  //添加注解标记整个方法为一个事务
public class CouponService implements ICouponService {

	@Autowired
	private ICouponDao coupondao;
	
	@Autowired
	private IMoneyDao moneydao;
	
	@Autowired
	private IBookDao bookdao;

	@Override
	public boolean insert(String userId, String bookId, int count) {
		
		if(bookdao.enough(bookId, count)) {  //判断库存
			bookdao.update(bookId, count);  //修改库存
		}
		
		double price = bookdao.getPrice(bookId);
		double total = price*count;
		
		if(moneydao.enough(userId, total)) { //判断余额
			coupondao.order(userId, bookId, count);  //生成订单
			moneydao.update(userId, total);  //修改余额
		}
		return false;
	}
}

注意:

  1. 使用CGLIB:修正された方法を含む@Transactionalアノテーションクラス、スプリングフレームワークは自動的にプロキシオブジェクトクラスを作成し、JDKは<AspectJの-自動プロキシプロキシターゲットクラス=「真」/ AOP>を追加することにより、代理オブジェクトを作成したデフォルトプロキシオブジェクトを作成し、その後、あなたはaspectjweaver-xxxjarパッケージを追加する必要があります。
  2. あなたは、そうでない場合は、無効な保護方法、デフォルトまたはプライベート、上@Transactionalアノテーションを使用することはできません。

@Transactionalアノテーションの属性:

1、rollbackFor とrollbackForClassNameは:トランザクションを右にロールバックされ、例外を指定します。デフォルトでは、トランザクションに投げた場合に実行されているときに例外(RuntimeExceptionをからの例外クラスの継承を)トランザクションをロールバックした後、;例外がスローされることなく、場合、または投げるチェック例外はまだトランザクションをコミットしています。このアプローチは、ほとんどの開発者が期待したアプローチですが、また、EJBでの取り扱いデフォルト、しかしが人為的に制御することができるトランザクションは、例外が時にいくつかの実行にスローされたときにトランザクションをコミット、またはいくつかの時間のチェックに投げることが必要です異常なロールトランザクションをバック。

2、noRollbackForとnoRollbackForClassName:トランザクションをロールバックするためにどの例外を指定していません。

3、読み取り専用:読み取り専用事務は、トランザクショナルリソースは読み取り専用の操作を指します。いわゆるトランザクションリソースは、データソース、JMSリソース、およびトランザクション・リソースなどのカスタムとして、これらのトランザクション管理リソースを指します。それは読み取り専用の操作にのみトランザクションリソースを決定された場合、トランザクションは、トランザクションのパフォーマンスを改善するために、読み取り専用としてマークすることができます。TransactionDefinitionでトランザクションが読み取り専用であるかどうかを示すブール値へ。トランザクションがバックエンドデータベースの実装によって開始された読み取り専用の最適化の措置が一度に、それゆえ、唯一のこれらのメソッドは、新しいトランザクションの伝播の振る舞い(PROPAGATION_REQUIRES_NEW、PROPAGATION_REQUIRED、ROPAGATION_NESTED)のを開始する可能性を持っているので、トランザクションにのみ宣言されます読書は理にかなっています。

。4、タイムアウト:固い(単位:秒)を可能にするために実行の最大時間を設定し、持続時間が超過した場合、トランザクションが完了し、自動的にトランザクションをロールバックされていないが発生org.springframework.transaction.TransactionTimedOutExceptionが異常。

5、伝播:トランザクション伝播の動作を指定し、取引方法は、別のトランザクションメソッドによって呼び出されたとき、あなたは、たとえば、トランザクションが、スプレッドどうあるべきかを指定する必要があります:継承されたメソッドは、既存のトランザクション内で実行することができる、またはそれは新しいものを開いて、ありその業務オペレーション。スプリングは、トランザクション伝播挙動(最初の二つが使用される)の以下の7種類が定義されています。

  • REQUIRED:トランザクションが動作して存在する場合、デフォルト値、現在の方法は、そのトランザクション内で実行されます、それ以外の場合は、新しいトランザクションを開始し、自分の業務を実行します。
  • REQUIRES_NEW:現在の方法は、新しいトランザクションを開始し、独自のトランザクション内で実行、トランザクションが実行されている場合は、新しいトランザクションがコミットまたは実行を再開する前にロールバックされるまで、現在のトランザクションが中断されて置かなければなりません。
  • サポートされています。トランザクションが動作してあった場合、現在の方法は、そのトランザクション内で実行、または非業務として実行されます。

  • NOT_SUPPORTED:トランザクションが実行されている場合、現在の方法では、トランザクション内で実行すべきではない、それが中断されます。

  • NEVER:現在の方法は、それ以外の場合は、例外がスローされます、トランザクション内で実行すべきではありません。

  • MANDATORY(必須[mændətɔːri] ADJ必須):現在の方法は、それ以外の場合は、例外がスローされます、トランザクション内で実行する必要があります。

  • NESTED(巣[巣] vネストされた。):そこ操作でトランザクション、このトランザクションのネストされたトランザクション内の現在の方法の実行がある、または新しいトランザクションを開始するために、独自のトランザクション内で実行する場合は、この時間REQUIREDに相当。注:入れ子の内部業務のために、独立して送信したり、内側のトランザクション実行時例外がスローされた場合、ロールバックは、外側のトランザクションがロールバックされ、内側総務事務の外側の層とは独立して、トランザクションは、内層になりますロールバック。

図6は、単離:指定されたトランザクション分離レベルは、春は、トランザクション分離レベルの次の5つの種類が定義されています。

  • DEFAULT:デフォルト値は、基礎となるデータベースのデフォルトの分離レベルを使用します。ほとんどのデータベースでは、通常はREAD_COMMITTED。

  • READ_UNCOMMITTED:別のトランザクション変更が、まだコミットされていないからデータを読み取ることができ、トランザクションを表します。ダーティ表示されることがあり、このレベルは、非反復読み取りまたはファントムを読み出し、分離レベルはほとんど使用されない読み取ります。

  • READ_COMMITTED:それだけで別のトランザクションが送信されたデータを読み取ることができ、トランザクションを表します。このレベルの防止のダーティ・リードが、ほとんどの場合、推奨される非反復可能読み取りやファントム読み取り、があるかもしれません。

  • REPEATABLE_READ:のコースを通して複数回のトランザクションを表し繰り返し、現在のトランザクションデータは、自己生成修正されない限り、クエリの実行、および各返されたレコードは、同じです。でも、複数のクエリ間のクエリを満たすために、新しいデータでは、これらの新しいレコードは無視されます。レベルは、ダーティ読み取り、非反復可能読み取りを防止するが、ファントムリードを発生し得ます。

  • SERIALIZABLE:すべてのトランザクションは、レベル間の各トランザクションを乱すことなく、順次一つずつ実行手段は、ダーティリード防ぐ、非反復読み取りおよびファントム読み取り、それは深刻なプログラムのパフォーマンスに影響しますので、通常はこれを必要としません。レベル;

  • MySQLサポートREAD_UNCOMMITTED、READ_COMMITTED、REPEATABLE_READと4種類のSERIALIZABLEトランザクション分離レベル、2つのトランザクション分離レベルは、デフォルトではREAD_COMMITEDであるオラクルのサポートREAD_COMMITEDとSERIALIZABLE:トランザクション分離レベルではなく、アプリケーションやフレームワークをサポートするよりも、基礎となるデータベースエンジンでサポートされますデフォルトは次のとおりです。REPEATABLE_READ。

公開された99元の記事 ウォンの賞賛3 ビュー1216

おすすめ

転載: blog.csdn.net/qq_44971038/article/details/104258826