總結:在類別中註入TransactionTemplate,即可在springboot中使用編程式事務。
spring支援編程式事務管理和宣告式交易管理兩種方式。
編程式事務管理使用TransactionTemplate或直接使用底層的PlatformTransactionManager。 Spring建議使用TransactionTemplate來管理程式設計事務。
宣告式事務管理是建立在AOP之上的。其本質是對方法前後進行攔截,然後在目標方法開始之前建立或加入一個事務,在執行完目標方法之後根據執行情況提交或回溯事務。 Spring Boot推薦使用@Transactional註解來實現聲明式事務管理。
多數情況下,方法上聲明@Transactional註解聲明事務即可,簡單、快捷、方便,但@Transactional聲明式事務的可控性太弱了,只可在方法或類別上聲明,做不到細粒度的事務控制。
如果一個方法前10條sql都是select查詢語句,只有最後2條sql是update語句,那麼只對最後2條sql做交易即可。
<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(); }); } }
/** * 事务模板 * @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如何使用的詳細內容。更多資訊請關注PHP中文網其他相關文章!