springboot編程式事務TransactionTemplate的使用說明
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; } }); } }
以上為個人經驗,希望能給大傢一個參考,也希望大傢多多支持WalkonNet。
推薦閱讀:
- 詳細談談Spring事務是如何管理的
- JAVA Spring中讓人頭痛的JAVA大事務問題要如何解決你知道嗎
- SpringBoot如何自定義starter
- MyBatis流式查詢的三種實現方法
- Spring源碼解析之編程式事務