基本概念 DataSourceConfiguration 创建DataSource DataSourceTransactionManagerAutoConfiguration 创建TransactionManager manager = new DataSourceTransactionManager(dataSource); TransactionManager 核心方法是 getTransaction ,commit, rollback 都由AbstractPlatformTransactionManager的抽象类实现 TransactionInfo 包含属性TransactionManager //... } 创建txInfo TransactionInfo txInfo = createTransactionIfNecessary() 创建transaction,实际调用transactionManager.getTransaction
ConditionalOnMissingBean(PlatformTransactionManager.class) public DataSourceTransactionManager transactionManager ( DataSourceProperties properties) { DataSourceTransactionManager transactionManager = null) { this.transactionManagerCustomizers.customize(transactionManager); } return transactionManager; } } } 如果没有指定transactionManager时,使用springboot时会自动配置 springboot项目中会使用这个transactionManager来进行事务的管理(如果没有使用@Transactional注解,springboot则不会进行事务管理)。
) { this.transactionManager = transactionManager; } public TransactionTemplate (PlatformTransactionManager transactionManager, TransactionDefinition transactionDefinition) { super(transactionDefinition); this.transactionManager = transactionManager; } public void setTransactionManager(PlatformTransactionManager transactionManager) { this.transactionManager 1、先配置transactionmanager <!
(TransactionManager transactionManager, Map<String, MapperStatement> mapperStatements) { this.transactionManager = transactionManager; this.mapperStatements = mapperStatements; } public TransactionManager (TransactionManager transactionManager) { this.transactionManager = transactionManager; } "); TransactionManager transactionManager =gettransactionManager(transactionManagerElt,dataSource transactionManager, Map<String, MapperStatement> mapperStatements) { this.transactionManager
(TransactionManager transactionManager, Map<String, MapperStatement> mapperStatements) { this.transactionManager = transactionManager; this.mapperStatements = mapperStatements; } public TransactionManager (TransactionManager transactionManager) { this.transactionManager = transactionManager; } "); TransactionManager transactionManager =gettransactionManager(transactionManagerElt,dataSource transactionManager, Map<String, MapperStatement> mapperStatements) { this.transactionManager
(transactionDefinition); if (逻辑执行正确) { //提交事务 transactionManager.commit(transactionStatus); } else { // 回滚事务 transactionManager.rollback(transactionStatus); // 记录日志 log.error(e); } 或者是 PlatformTransactionManager transactionManager = Objects.requireNonNull (transactionDefinition); try{ //提交事务 transactionManager.commit(transactionStatus); } catch (Exception e) { // 回滚事务 transactionManager.rollback(transactionStatus); // 记录日志
-- 2.配置事务的增强,指定对哪个事务管理器进行增强 --> <tx:advice id="txAdvice" transaction-manager="<em>transactionManager</em>" -- 2.开启事务的注解 --> <tx:annotation-driven transaction-manager="<em>transactionManager</em>"></tx:annotation-driven ") String value() default ""; @AliasFor("value") String transactionManager() default ""; = new DataSourceTransactionManager(); transactionManager.setDataSource(dataSource); return transactionManager; } }
属性指定事务管理器bean名称,如: @Transactional(transactionManager = "transactionManager1", propagation = Propagation.REQUIRED , name); } 这里补充一下,之前我们使用@Transactional的时候,并没有通过value或者transactionManager设置事务管理器,这是为什么? Service1中: @Transactional(transactionManager = "transactionManager1", propagation = Propagation.REQUIRED ,事务传播行为:REQUIRED 3、从spring容器中找到事务管理器transactionManager1,然后问一下transactionManager1,当前上下文中有没有事务,显然现在是没有的 ,事务传播行为:REQUIRED 11、从spring容器中找到事务管理器transactionManager1,然后问一下transactionManager1,当前上下文中有没有事务,显然是是有的,
transactionManager=new TransactionManager(); @Override public int buy(String username, String ("用户"+username+"购买了"+productname); transactionManager.transaction_submit(); }catch (Exception e){ e.printStackTrace(); transactionManager.transaction_rollback( (); System.out.println("订单"+orderNum+"申请退回"); transactionManager.transaction_submit (); } } } 因为购买和退货的实际操作中会涉及到数据库,所以我们引入事务整个概念,来控制整个流程,现在创建一个TransactionManager来管理事务: package
二是TransactionManager TransactionStatus status = transactionManager.getTransaction(new DefaultTransactionDefinition (status); } catch (Exception e) { transactionManager.rollback(status); */ @Component public class TransactionUtil { @Autowired private PlatformTransactionManager transactionManager ; public boolean transact(Consumer consumer) { TransactionStatus status = transactionManager.getTransaction (status); return true; } catch (Exception e) { transactionManager.rollback
* * @return transaction manager */ TransactionManager getTransactionManager(); } AtomikosTransactionManager implements XATransactionManager { private final UserTransactionManager transactionManager ().enlistResource(xaResource); } @Override public TransactionManager getTransactionManager @Before public void setUp() { ReflectiveUtil.setProperty(atomikosTransactionManager, "transactionManager <TransactionManager>is(userTransactionManager)); } @Test public void assertClose() {
下面先说声明式: Spring配置文件中关于事务配置总是由三个组成部分,分别是DataSource、TransactionManager和代理机制这三部分,无论哪种配置方式,一般变化的只是代理机制这部分 DataSource、 TransactionManager这两部分只是会根据数据访问方式有所变化,比如使用Hibernate进行数据访问时,DataSource实际为 SessionFactory,TransactionManager -- 第一种配置事务的方式 ,tx--> <tx:advice id="txadvice" transaction-manager="<em>transactionManager</em>"> <tx:attributes " ref="<em>transactionManager</em>"></property> <property name="transactionAttributes"> <props> -- 第四种配置事务的方式,注解 --> <tx:annotation-driven transaction-manager="<em>transactionManager</em>"/> 注解文件: package com.dao
MockBean 测试代码示例 使用原生的Bean @SpringBootTest class TransactionManagerNoMockTest { @Resource private TransactionManager transactionManager; @Test void getUserInfo() { User user = transactionManager.getUserInfo 上下文中的UserManager */ @MockBean private UserManager userManager; @Resource private TransactionManager transactionManager; @BeforeEach public void setUp() { //重置Mock,防止重复设置 Mockito.reset userId.toString()).build(); }); } @Test void getUserInfo() { User user = transactionManager.getUserInfo
1.编程式事务 在 Spring Boot 中实现编程式事务又有两种实现方法: 使用 TransactionTemplate 对象实现编程式事务; 使用更加底层的 TransactionManager TransactionTemplate 注入到当前类中 ,然后再使用它提供的 execute 方法执行事务并返回相应的执行结果,如果程序在执行途中出现了异常,那么就可以使用代码手动回滚事务,具体实现代码如下: 1.2 TransactionManager 使用 TransactionManager 实现编程式事务相对麻烦一点,它需要使用两个对象:TransactionManager 的子类,加上 TransactionDefinition 事务定义对象 ,再通过调用 TransactionManager 的 getTransaction 获取并开启事务,然后调用 TransactionManager 提供的 commit 方法提交事务,或使用它的另一个方法 其中编程式事务又分为两种实现:使用 TransactionTemplate 对象或更加底层的 TransactionManager 对象分别实现编程式事务,它们的优点是灵活性更高,可以在任何代码片段上添加事务
前面说了搭建MyBatis环境,本文是对MyBatis使用时的核心配置文件的一些说明 目录 environments transactionManager DataSource 引入jdbc.properties -- 事务管理器 --> <transactionManager type="JDBC"></transactionManager> <! -- 事务管理器 --> <transactionManager type="JDBC"></transactionManager> <! type="JDBC"></transactionManager> <dataSource type="POOLED"> <property name -- transactionManager:设置事务管理方式 属性: type="JDBC|MANAGED" JDBC:表示当前环境中
-- 定义事务管理器(声明式的事务) --> <bean id="<em>transactionManager</em>" class="org.springframework.orm.hibernate3 -- 配置事务管理器 --> <property name="transactionManager" ref="transactionManager" /> -- 定义事务管理器(声明式的事务) --> <bean id="<em>transactionManager</em>" class="org.springframework.orm.hibernate3 -- 配置事务管理器 --> <property name="transactionManager" ref="transactionManager" /> " ref="transactionManager" /> <!
) { Assert.notNull(transactionManager, "The 'transactionManager' argument must not be null."); this.transactionTemplate = new TransactionTemplate(transactionManager); } public Object someServiceMethod private final TransactionTemplate transactionTemplate; public SimpleService(PlatformTransactionManager transactionManager ) { Assert.notNull(transactionManager, "The 'transactionManager' argument must not be null."); this.transactionTemplate = new TransactionTemplate(transactionManager); // the transaction settings
org.springframework.transaction.support.DefaultTransactionDefinition;public class TransactionTest { private PlatformTransactionManager transactionManager ; public void performTransaction() { // 开启事务 TransactionStatus status = transactionManager.getTransaction try { // 执行数据库操作 // ... // 提交事务 transactionManager.commit (status); } catch (Exception e) { // 回滚事务 transactionManager.rollback(status ); } }}在上述代码中,transactionManager代表了Spring事务管理器,通过调用getTransaction()方法获取到事务,并在事务执行结束后调用commit
DefaultTransactionDefinition def = new DefaultTransactionDefinition(); 对象 使用 TransactionStatus status = transactionManager.getTransaction (def);来开启一个事务, 使用 transactionManager.rollback(status); 来回滚这个事务 使用 transactionManager.commit(status); class UserServiceImpl implements UserService { @Autowired private DataSourceTransactionManager transactionManager def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED); TransactionStatus status = transactionManager.getTransaction execute your business logic here //db operation } catch (Exception ex) { transactionManager.rollback
= null); short acks = configureAcks(config, transactionManager ! transactionManager.resetProducerId(); if (! transactionManager.hasFatalError()) { transactionManager.transitionToFatalError(new KafkaException if (transactionManager.hasFatalError() || ! transactionManager.hasProducerId()) { RuntimeException lastError = transactionManager.lastError