Spring事务的几种实现方式

前言

1.、事务几种实现方式
(1)编程式事务管理对基于 POJO 的应用来说是唯一选择。我们需要在代码中调用beginTransaction()、commit()、rollback()等事务管理相关的方法,这就是编程式事务管理。
(2)基于 TransactionProxyFactoryBean的声明式事务管理
(3)基于 @Transactional 的声明式事务管理
(4)基于Aspectj AOP配置事务

简单总结一下编程式事务管理

第一种:使用 TransactionTemplate 事务模板对象

  1. 首先:因为我们使用的是特定的平台,所以,我们需要创建一个合适我们的平台事务管理PlateformTransactionManager。如果使用的是JDBC的话,就用DataSourceTransactionManager。注意需要传入一个DataSource,这样,平台才知道如何和数据库打交道。

  2. 第二: 为了使得平台事务管理器对我们来说是透明的,就需要使用TransactionTemplate。使用TransactionTemplat需要传入一个PlateformTransactionManager 进入,这样,我们就得到了一个TransactionTemplate,而不用关心到底使用的是什么平台了。

  3. 第三: TransactionTemplate 的重要方法就是 execute 方法,此方法就是调用TransactionCallback 进行处理。实际上我们需要处理的事情全部都是在 TransactionCallback 中编码的。

  4. 第四: 也就是 TransactionCallback 接口,我们可以定义一个类并实现此接口,然后作为TransactionTemplate.execute 的参数。把需要完成的事情放到 doInTransaction中,并且传入一个TransactionStatus 参数。此参数是来调用回滚的。 也就是说 ,PlateformTransactionManager 和 TransactionTemplate 只需在程序中定义一次,而TransactionCallback 和 TransactionStatus 就要针对不同的任务多次定义了。

这就是Spring的编程式事务管理。下面贴出例子代码:

步骤:
1.配置事务管理器


	   
	   		
	   

2.配置事务模板对象


       
            
        

3.Test

@Controller
@RequestMapping("/tx")
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"classpath:applicationContext.xml"})
public class TransactionController {

	@Resource
	public TransactionTemplate transactionTemplate;

	@Resource
	public PlatformTransactionManager transactionManager;
	
	@Resource
	public DataSource dataSource;

	private static JdbcTemplate jdbcTemplate;

	private static final String INSERT_SQL = "insert into cc(id) values(?)";
	private static final String COUNT_SQL = "select count(*) from cc";

	@Test
	public void TransactionTemplateTest(){
		//获取jdbc核心类对象,进而操作数据库
		jdbcTemplate = new JdbcTemplate(dataSource);
		//通过注解 获取xml中配置的 事务模板对象
		transactionTemplate.setIsolationLevel(TransactionDefinition.ISOLATION_READ_COMMITTED);
		//重写execute方法实现事务管理
		transactionTemplate.execute(new TransactionCallbackWithoutResult() {
			@Override
			protected void doInTransactionWithoutResult(TransactionStatus status) {
				jdbcTemplate.update(INSERT_SQL, "33");   //字段sd为int型,所以插入肯定失败报异常,自动回滚,代表TransactionTemplate自动管理事务
			}
		});
		int i = jdbcTemplate.queryForInt(COUNT_SQL);
		System.out.println("表中记录总数:"+i);
	}

}

第二种:使用 事务管理器 PlatformTransactionManager 对象

此方式,可手动开启、提交、回滚事务。

**1.只需要:配置事务管理 **


	   
	   		
	   

2.Test

@Controller
@RequestMapping("/tx")
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"classpath:applicationContext.xml"})
public class TransactionController {

   @Resource
	public PlatformTransactionManager transactionManager;
	
	@Resource
	public DataSource dataSource;
	
	private static JdbcTemplate jdbcTemplate;

	private static final String INSERT_SQL = "insert into cc(id) values(?)";
	private static final String COUNT_SQL = "select count(*) from cc";

	@Test
	public void showTransaction(){
		//定义使用隔离级别,传播行为
		DefaultTransactionDefinition def = new DefaultTransactionDefinition();
		def.setIsolationLevel(TransactionDefinition.ISOLATION_READ_COMMITTED);
		def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);
		//事务状态类,通过PlatformTransactionManager的getTransaction方法根据事务定义获取;获取事务状态后,Spring根据传播行为来决定如何开启事务
		TransactionStatus transaction = transactionManager.getTransaction(def);
		jdbcTemplate = new JdbcTemplate(dataSource);
		int i = jdbcTemplate.queryForInt(COUNT_SQL);
		System.out.println("表中记录总数:"+i);
		try {
			jdbcTemplate.update(INSERT_SQL,"2");
			jdbcTemplate.update(INSERT_SQL,"是否");//出现异常,因为字段为int类型,会报异常,自动回滚
			transactionManager.commit(transaction);
		}catch (Exception e){
			e.printStackTrace();
			transactionManager.rollback(transaction);
		}
		int i1 = jdbcTemplate.queryForInt(COUNT_SQL);
		System.out.println("表中记录总数:"+i1);
	}
}

以下为声明式事务管理

第三种:基于Aspectj AOP开启事务

1.配置事务通知


	   
      	
	      	
      	
       

2.配置织入


       
       
      	
      	
      

3.这样就算是给 cn.sys.service下所有的方法加入了事务

第四种:基于注解的 @Transactional 的声明式事务管理

@Transactional
    public int saveRwHist(List list) {
       return rwDao.saveRwHist(list);
    }

以上所需的总配置文件



           
       
       
       		
       
    
    

       
       
       		
       		
       		
       		

       		
       		
       		
       		
       		
       		
       		

       		
       		
			
			
			
			
			
       

       
       
       		
       		
       

       
       
       		
       

       
	   

	   
	   
	   		
	   

        
       
            
        


	   
      	
	      	
      	
       
       

       
      	
      	
      

你可能感兴趣的:(Spring)