Summary: Inject TransactionTemplate into the class to use programmatic transactions in springboot.
spring supports two methods: programmatic transaction management and declarative transaction management.
Programmatic transaction management uses TransactionTemplate or directly uses the underlying PlatformTransactionManager. Spring recommends using TransactionTemplate to manage programming transactions.
Declarative transaction management is built on AOP. Its essence is to intercept the method before and after, and then create or join a transaction before the target method starts. After the target method is executed, the transaction is committed or rolled back according to the execution status. Spring Boot recommends using the @Transactional annotation to implement declarative transaction management.
In most cases, just declare the @Transactional annotation on the method to declare the transaction, which is simple, fast and convenient. However, the controllability of the @Transactional declarative transaction is too weak, and it can only be declared on the method or class. Fine-grained transaction control is not possible.
If the first 10 sql statements of a method are all select query statements, and only the last 2 sql statements are update statements, then only the last 2 sql statements can be processed.
<dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>2.2.0</version> </dependency>
to introduce the mybatis-spring-boot-starter dependency package into springboot.
The mybatis-spring-boot-starter dependency package contains the dependencies of spring-boot-starter-jdbc. spring-boot-starter-jdbc contains the DataSourceTransactionManager transaction manager and the automatic injection configuration class DataSourceTransactionManagerAutoConfiguration.
Used in code, just inject TransactionTemplate into the bean:
@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; } }); } }
The above is the detailed content of How to use springboot programmatic transaction TransactionTemplate. For more information, please follow other related articles on the PHP Chinese website!