Spring事务注意事项

Spring事务注意事项 

Spring有两种事务操作方式。
1.采用编程式事务。
2.采用注解声明式事务。
编程式事务依赖于Spring事务管理的两个核心类。分别式:
1. PlatformTransactionManager
2. TransactionTemplate(推荐使用)
PlatformTransactionManager的使用  
1. 先注入DataSource到事务管理器中。


 
2. 使用
@Resource   private PlatformTransactionManager txManager;    
......    
//定义事务隔离级别,传播行为,     
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);  
     //回滚     
     }  
TransactionTemplate的使用该类继承了接口DefaultTransactionDefinition,用于简化事务管理,事务管理由模板类定义,
主要是通过TransactionCallback回调接口或TransactionCallbackWithoutResult回调接口指定,
通过调用模板类的参数类型为TransactionCallback或TransactionCallbackWithoutResult的execute方法来自动享受事务管理。
TransactionTemplate模板类使用的回调接口:
1. TransactionCallback:通过实现该接口的“T doInTransaction(TransactionStatus status) ”方法来定义需要事务管理的操作代码;
TransactionCallbackWithoutResult:继承TransactionCallback接口, 
2. 提供“void doInTransactionWithoutResult(TransactionStatus status)”便利接口用于方便那些不需要返回值的事务操作代码。
//构造函数初始化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自动管理事务  
}} );
声明式事务声明式事务操作简单,无侵入式,与业务代码分开。声明式事务也有两种实现方式。
1. 采用Spring的定义事务通知与AOP配置实现。
2. 通过@Transactional实现。



    
        
        
        
        
    



   
   
   

注意点:
1.@Transactional 注解由于原理决定了他只能作用于public方法中,而这里改为private,就完全被忽略无视了。
2.必须要将方法写到另一个类中,而且要通过spring的注入方式进行调用才可以。

3.一共有四个属性如下,
mode:指定Spring事务管理框架创建通知bean的方式。可用的值有proxy和aspectj。前者是默认值,表示通知对象是个JDK代理;后者表示Spring AOP会使用AspectJ创建代理 
proxy-target-class:如果为true,Spring将创建子类来代理业务类;如果为false,则使用基于接口的代理。(如果使用子类代理,需要在类路径中添加CGLib.jar类库) 
order:如果业务类除事务切面外,还需要织入其他的切面,通过该属性可以控制事务切面在目标连接点的织入顺序。 
transaction-manager:指定到现有的PlatformTransaction Manager bean的引用,通知会使用该引用 
 

你可能感兴趣的:(Spring)