首頁 > Java > java教程 > springboot編程序事務TransactionTemplate如何使用

springboot編程序事務TransactionTemplate如何使用

PHPz
發布: 2023-06-01 17:40:24
轉載
2100 人瀏覽過

TransactionTemplate的使用

總結:在類別中註入TransactionTemplate,即可在springboot中使用編程式事務。

spring支援編程式事務管理和宣告式交易管理兩種方式。

編程式事務管理使用TransactionTemplate或直接使用底層的PlatformTransactionManager。 Spring建議使用TransactionTemplate來管理程式設計事務。

宣告式事務管理是建立在AOP之上的。其本質是對方法前後進行攔截,然後在目標方法開始之前建立或加入一個事務,在執行完目標方法之後根據執行情況提交或回溯事務。 Spring Boot推薦使用@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,&#39;aaa&#39;,&#39;aaa&#39;,&#39;aaa&#39;)"); 
        int i = 1/0; 
        jdbcTemplate.execute("insert into user value (2,&#39;aaa&#39;,&#39;aaa&#39;,&#39;aaa&#39;)"); 
    } 
 
    public void test2(){ 
      getRequiresNewTransactionTemplate()
      //  transactionTemplate
                .execute(new TransactionCallback<Void>() {
 
            @Override
            public Void doInTransaction(TransactionStatus status) {  
                jdbcTemplate.execute("insert into user value (11,&#39;BBBB&#39;,&#39;aaa&#39;,&#39;aaa&#39;)");
 
                int i = 1/0; 
                jdbcTemplate.execute("insert into user value (21,&#39;aaa&#39;,&#39;NNNN&#39;,&#39;aaa&#39;)");  
                return null;
            }
        });
    }  
}
登入後複製

以上是springboot編程序事務TransactionTemplate如何使用的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:yisu.com
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板