springboot编程式事务TransactionTemplate的使用说明

2022-07-14,,,

transactiontemplate的使用

总结:在类中注入transactiontemplate,即可在springboot中使用编程式事务

spring支持编程式事务管理和声明式事务管理两种方式。

编程式事务管理使用transactiontemplate或者直接使用底层的platformtransactionmanager。对于编程式事务管理,spring推荐使用transactiontemplate。

声明式事务管理建立在aop之上的。其本质是对方法前后进行拦截,然后在目标方法开始之前创建或者加入一个事务,在执行完目标方法之后根据执行情况提交或者回滚事务。对于声明式事务管理,springboot中推荐使用@transactional注解。

1.为何用?

多数情况下,方法上声明@transactional注解声明事务即可,简单、快捷、方便,但@transactional声明式事务的可控性太弱了,只可在方法或类上声明,做不到细粒度的事务控制。

如果一个方法前10条sql都是select查询语句,只有最后2条sql是update语句,那么只对最后2条sql做事务即可。

2.如何用

        <dependency>
            <groupid>org.mybatis.spring.boot</groupid>
            <artifactid>mybatis-spring-boot-starter</artifactid>
            <version>2.2.0</version>
        </dependency>

springboot中引入mybatis-spring-boot-starter依赖包即可。

mybatis-spring-boot-starter依赖包中包含了spring-boot-starter-jdbc的依赖,spring-boot-starter-jdbc中包含datasourcetransactionmanager事务管理器以及自动注入配置类datasourcetransactionmanagerautoconfiguration。

代码中使用,在使用bean中注入transactiontemplate即可:

@service
public class testserviceimpl {
    @resource
    private transactiontemplate transactiontemplate;
    public object testtransaction() {
        //数据库查询
        dao.select(1);
        return transactiontemplate.execute(status -> {
            //数据库新增
            dao.insert(2);
            dao.insert(3);
            return new object();
        });
    }
}

transactiontemplate简单使用

/**
 * 事务模板
 * @author zz
 *
 */ 
public class transactiontemplatesupport {
	@autowired
	private platformtransactionmanager transactionmanager;	
	private transactiontemplate requiredtransactiontemplate;	
	protected transactiontemplate getrequiresnewtransactiontemplate(){
		if (requiredtransactiontemplate == null){
			requiredtransactiontemplate = new transactiontemplate(transactionmanager);
			requiredtransactiontemplate.setpropagationbehavior(transactiontemplate.propagation_required);
		//	requiredtransactiontemplate.setreadonly(true);
		//	requiredtransactiontemplate.settimeout(30000);
		}
		
		return requiredtransactiontemplate;
	} 
}
@service
public class testtransaction extends transactiontemplatesupport  { 
    @autowired
    private jdbctemplate jdbctemplate ;
 
    @autowired
    private transactiontemplate transactiontemplate;
 
   // @transactional
    public void test(){
 
        jdbctemplate.execute("insert into user value (1,'aaa','aaa','aaa')"); 
        int i = 1/0; 
        jdbctemplate.execute("insert into user value (2,'aaa','aaa','aaa')"); 
    } 
 
    public void test2(){ 
      getrequiresnewtransactiontemplate()
      //  transactiontemplate
                .execute(new transactioncallback<void>() {
 
            @override
            public void dointransaction(transactionstatus status) {  
                jdbctemplate.execute("insert into user value (11,'bbbb','aaa','aaa')");
 
                int i = 1/0; 
                jdbctemplate.execute("insert into user value (21,'aaa','nnnn','aaa')");  
                return null;
            }
        });
    }  
}

以上为个人经验,希望能给大家一个参考,也希望大家多多支持。 

《springboot编程式事务TransactionTemplate的使用说明.doc》

下载本文的Word格式文档,以方便收藏与打印。