码迷,mamicode.com
首页 > 编程语言 > 详细

spring - transaction - 事务抽象

时间:2021-03-29 12:08:01      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:方法   comm   提交   ext   into   poi   except   cte   查看   

??Spring事务抽象 - 简介

??Spring事务抽象 - 模型

Spring提供了统一的事务抽象,可以让我们以统一的Api进行事务管理具体的操作交给不同的TransitionManager实现完成。
技术图片

?? Spring事务抽象 - 接口介绍

PlatformTransactionManager - 根据TransitionDefinition创建事务、事务回滚、事务提交

  • getTransaction() - 开启事务
  • commit() - 提交事务
  • rollback() - 回滚事务

TransitionDefinition - 定义事务特征,比如传播机制隔离界别readonlytimeout遇到什么异常回滚
TransactionStatus - 保存事务状态

Propagation - 传播行为,一般查询方法使用SUPPORTS,更新、插入、删除方法使用REQUIRED

Isolation - 隔离级别

TransitionTemplate - 用于编程式事务(用法类似JdbcTemplate)

TransitionCallback/TransactionCallbackWithoutResult- 给TransationTemplate提供回调

?? 声明式事务 - 注解方式

1??配置TransactionManager(事务管理器)

<!-- spring-tx - 事务管理器-->
<bean id="transtionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <!-- 事务超时时间 default -1 -->
    <property name="defaultTimeout" value="-1" />
    <property name="dataSource" ref="datasource" />
</bean>

2??开启@Transaction注解支持

<!-- 声明式事务 - 开启注解 -->
<tx:annotation-driven transaction-manager="transtionManager" />

3?? 使用@Tranaction注解?

/*
* 使用事务 - @Transitional
* */
@Transactional
public void insert() {
    // 1. 插入数据
    int update = jdbcTemplate.update("insert into tb_area value (null,‘东校区‘)");
    // 2. 抛出异常
    throw new RuntimeException("出现了错误");
    // 3. 查看是否回滚
}

?? 声明式事务 - XML方式

1?? 配置TransactionManager

 <!-- spring-tx - 事务管理器-->
<bean id="transtionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <!-- 事务超时时间 default -1 -->
    <property name="defaultTimeout" value="-1" />
    <property name="dataSource" ref="datasource" />
</bean>

2?? 使用<tx:advice>定义事务切面

<!-- 声明式事务 - 开启注解 -->
<tx:advice id="txAdvice" transaction-manager="transtionManager">
	<tx:attributes>
		<tx:method name="*" />
	</tx:attributes>
</tx:advice>

3??把?<tx:advice>事务切面织入到target

 <!-- 配置aspectj - 切面 -->
<aop:config>
    <aop:pointcut id="pc" expression="execution(* com.yuki.tx.XmlService.*(..))"/>
    <aop:advisor advice-ref="txAdvice" pointcut-ref="pc" />
</aop:config>

?? 编程式事务

有两种方式

  • 直接使用TransactionManager - 自己控制事务,自己决定什么时候rollbackcommit
  • 使用TransactionTemplate - 只用提供回调,方法抛RuntimeException回滚

?? 使用TranactionManager

/*
* 使用事务 - 
* DefaultTransactionDefinition - 定义事务特征,比如propagation、isolation
* TransactionManager - 事务管理
* */
public void useTxManager() {
  // 1. 初始化TransitionDefinition -
     DefaultTransactionDefinition transitionDefinition = new DefaultTransactionDefinition();
     transitionDefinition.setPropagationBehavior(Propagation.REQUIRED.value());
     // 2. 开启事务
     TransactionStatus transactionStatus = transactionManager.getTransaction(transitionDefinition);
     try {
        // 1. 插入数据
        int update = jdbcTemplate.update("insert into tb_area value (null,‘东校区‘)");
        // 2. 抛出异常
        if(update == 1) {
            throw new RuntimeException("出现了错误");
        }
        transactionManager.commit(transactionStatus);
    }catch (Exception e) {
         e.printStackTrace();
         transactionManager.rollback(transactionStatus);
    }
 }

?? 使用TransactionTemplate

1??配置TransactionTemplate

 <!-- 编程式 - 事务 -->
<bean id="transactionTemplate" class="org.springframework.transaction.support.TransactionTemplate">
        <property name="transactionManager" ref="transtionManager" />
</bean>

使用TranactionTemplate,并使用TransactionCallback提供回调

/*
* 使用事务 - 
* TransitionTemplate - 类似JdbcTemplate,内部视同TransactionManager进行事务操作
* TransitionCallabck、TransactionCallbackWithoutResult - 提供回调
* */
public void useTxTemplate() {
    transactionTemplate.execute(new TransactionCallback() {
        public Object doInTransaction(TransactionStatus transactionStatus) {
            int update = jdbcTemplate.update("insert into tb_area value (null,‘东校区‘)");
            // 2. 抛出异常
            if(update == 1) {
                throw new RuntimeException("出现了错误");
            }
            // 3. 返回值
            return update;
        }
    });
}

spring - transaction - 事务抽象

标签:方法   comm   提交   ext   into   poi   except   cte   查看   

原文地址:https://www.cnblogs.com/yuki2333/p/14584242.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!