Résumé : Injecter TransactionTemplate dans la classe pour utiliser des transactions programmatiques dans Springboot.
spring prend en charge à la fois la gestion programmatique des transactions et la gestion déclarative des transactions.
La gestion programmatique des transactions utilise TransactionTemplate ou utilise directement le PlatformTransactionManager sous-jacent. Spring recommande d'utiliser TransactionTemplate pour gérer les transactions de programmation.
La gestion déclarative des transactions est construite sur AOP. Son essence est d'intercepter la méthode avant et après, puis de créer ou de rejoindre une transaction avant le démarrage de la méthode cible. Une fois la méthode cible exécutée, la transaction est validée ou annulée en fonction de l'état d'exécution. Spring Boot recommande d'utiliser l'annotation @Transactional pour implémenter la gestion déclarative des transactions.
Dans la plupart des cas, il suffit de déclarer l'annotation @Transactional sur la méthode pour déclarer la transaction. Cependant, la contrôlabilité de la transaction déclarative @Transactional est trop faible. et ne peut être utilisé que sur la méthode ou la classe, un contrôle précis des transactions n'est pas possible.
Si les 10 premières instructions SQL d'une méthode sont toutes des instructions de requête de sélection et que seules les 2 dernières instructions SQL sont des instructions de mise à jour, alors seules les 2 dernières instructions SQL peuvent être traitées.
<dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>2.2.0</version> </dependency>
springboot pour introduire le package de dépendances mybatis-spring-boot-starter.
mybatis-spring-boot-starter package de dépendances contient les dépendances de spring-boot-starter-jdbc, spring-boot-starter-jdbc contient le gestionnaire de transactions DataSourceTransactionManager et la classe de configuration d'injection automatique DataSourceTransactionManagerAutoConfiguration.
Utilisé dans le code, injectez simplement TransactionTemplate dans le 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; } }); } }
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!