@Transactional注記個人概要


@Transactionalは、インタフェース、インタフェースメソッド、クラスメソッド、およびクラスメソッドに使用できます.クラスに使用する場合、クラスのすべてのpublicメソッドにはトランザクション属性があります.また、メソッドレベルでこの寸法を使用してクラスレベルの定義を上書きすることもできます.@Transactional注記は、インタフェース、インタフェース・メソッド、クラスおよびクラス・メソッドに使用できますが、Springはインタフェースまたはインタフェース・メソッドでは使用しないことを推奨します.これは、インタフェース・ベースのエージェントを使用する場合にのみ有効になるためです.また,@Transactional注記はpublicメソッドにのみ適用されるべきであり,これはSpring AOPの本質によって決定される.@Transactional注記をprotected、private、またはデフォルトの可視性メソッドで使用すると、これは無視され、例外も放出されません.デフォルトでは、AOPエージェントによって取得されるのは外部からのメソッド呼び出しのみです.つまり、クラス内メソッドがこのクラス内の他のメソッドを呼び出すと、@Transactional注釈を使用して呼び出されてもトランザクション動作は起こりません.
個人総括:@Transactionalはメソッド全体の論理をすべてトランザクションに組み込むことであり、外部インタフェースを呼び出してもトランザクションを開く方法がない限り、同じトランザクションとして扱われます.
以下に具体的な事例を示します.
        @Override
	@Transactional
	public void test1() {
		eventLogService.addEventLog("1", "1", "1");
		test2();
		test4();
		test5();
		test();
	}

	@Override
	@Transactional(propagation=Propagation.REQUIRES_NEW, rollbackFor = Exception.class)
	public void test2() {
		eventLogService.addEventLog("3", "3", "3");
	}

	@Override
	public void test5() {
		eventLogService.addEventLog("3", "3", "3");
	}
	
	private void test() {
		eventLogService.addEventLog("2", "2", "2");
		throw new CouponException("2000", "xiaoxiao");
	}
	
	public void test4() {
		eventLogService.addEventLog("4", "4", "4");
	}     

     public void addEventLog(String a1, String a2, String a3) {
		insert();
	}

実行結果、test()関数に異常が発生し、他の関数は実際にデータベースにデータを追加していないため、上記の黒字の結論を確認できます.