spring 事务 @Transactional注解参数 tx:annotation-driven

首先修改applicationContext.xml如下:



        
        
        
        
















 实现类代码:

@Transactional
public class UserScoreRepositoryImpl implements UserScoreRepository {

	private JdbcTemplate jdbcTemplate;

	@Override
	public UserScore getUserSocore(String userNo) {

	final UserScore us = new UserScore();
	...
	return us;
	}
	...

}
OK了!以上就实现了简单的事务管理了。现在再稍微了解下@Transactional。
在配置文件中,默认情况下,会自动使用名称为transactionManager的事务管理器。

所以,如果定义的事务管理器名称为transactionManager,那么就可以直接使用。如下:


	
	

	
	
一共有四个属性如下,
  • mode:指定Spring事务管理框架创建通知bean的方式。可用的值有proxy和aspectj。前者是默认值,表示通知对象是个JDK代理;后者表示Spring AOP会使用AspectJ创建代理
  • proxy-target-class:如果为true,Spring将创建子类来代理业务类;如果为false,则使用基于接口的代理。(如果使用子类代理,需要在类路径中添加CGLib.jar类库)
  • order:如果业务类除事务切面外,还需要织入其他的切面,通过该属性可以控制事务切面在目标连接点的织入顺序。
  • transaction-manager:指定到现有的PlatformTransaction Manager bean的引用,通知会使用该引用
@Transactional标注的位置
@Transactional注解可以标注在类和方法上,也可以标注在定义的接口和接口方法上。
如果我们在接口上标注@Transactional注解,会留下这样的隐患:因为注解不能被继承,所以业务接口中标注的@Transactional注解不会被业务实现类继承。所以可能会出现不启动事务的情况。所以,Spring建议我们将@Transaction注解在实现类上。
在方法上的@Transactional注解会覆盖掉类上的@Transactional。


使用不同的事务管理器
如果我们要程序中使用多个事务管理器(主要是针对多数据源的情况),可以通过以下的方式实现:
Service代码:

public class MultiTxService {
	@Transactional("tran_1")
	public void addTest(int id){
		
	}
	@Transactional("tran_2")
	public void deleteTest(int id){
		
	}

}
applicationContext.xml配置如下: 


	


	
经过以上的代码,每个事务都会绑定各自的独立的数据源,进行各自的事务管理。我们可以优化下以上代码,可以自定义一个绑定到特定事务管理器的注解,然后直接使用这个自定义的注解进行标识:

@Target({ElementType.METHOD,ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Transactional("tran_1")
public @interface CustomerTransactional {

}
在Service代码中使用:
...
//使用名为tran_1的事务管理器
@CustomerTransactional
public void addTest(String str){
	
}
…


你可能感兴趣的:(Spring基础)