spring控制事务的三种方式小结

 更新时间:2021年10月08日 16:57:18   作者:崇尚至简  
这篇文章主要介绍了spring控制事务的三种方式小结,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

首先准备环境,目录结构如下

数据库准备

业务层代码

@Service("accountService")
public class AccountServiceImpl implements AccountService {
	@Resource(name = "accountDao")
	AccountDao accountDao;
	public void transfer(Integer from, Integer to, Float money) {
		accountDao.subMoney(from,money);
                int i = 1/0;    //此处引发异常
		accountDao.addMoney(to,money);
	}
}

持久层代码

public class AccountDaoImpl extends JdbcDaoSupport implements AccountDao {
	public void addMoney(Integer id, Float money) {
		getJdbcTemplate().update("update account set money=money+? where id=?", money , id);
	}
	public void subMoney(Integer id, Float money) {
		getJdbcTemplate().update("update account set money=money-? where id=?", money , id);
	}
}

测试代码

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext.xml")
public class Test {
	@Resource(name="accountService")
	private AccountService accountService;
	@org.junit.Test
	public void test(){
		accountService.transfer(1,2,100f);
	}
}

运行结果

现在来用三种方式进行事务控制

方式一:编码方式(需要修改源代码,基本不会用)

添加事务管理类和事务模板类

    <!-- 事务核心管理器,封装了所有事务操作. 依赖于连接池 -->
    <bean name="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager" >
        <property name="dataSource" ref="dataSource" ></property>
    </bean>
    <!-- 事务模板对象 -->
    <bean name="transactionTemplate" class="org.springframework.transaction.support.TransactionTemplate" >
        <property name="transactionManager" ref="transactionManager" ></property>
    </bean>

修改业务层代码

@Service("accountService")
public class AccountServiceImpl implements AccountService {
	@Resource(name = "accountDao")
	AccountDao accountDao;
	@Resource(name="transactionTemplate")
	private TransactionTemplate transactionTemplate;
	public void transfer(final Integer from, final Integer to, final Float money) {
		transactionTemplate.execute(new TransactionCallbackWithoutResult() {
			@Override
			protected void doInTransactionWithoutResult(TransactionStatus status) {
				accountDao.subMoney(from,money);
				int i = 1/0;
				accountDao.addMoney(to,money);
			}
		});
 
	}
}

方式二:xml配置(不需要改动代码,直接配置xml)

<!-- 配置事务通知 -->
    <tx:advice id="txAdvice" transaction-manager="transactionManager" >
        <tx:attributes>
            <!-- 以方法为单位,指定方法应用什么事务属性
                isolation:隔离级别
                propagation:传播行为
                read-only:是否只读
             -->
            <tx:method name="find*" isolation="REPEATABLE_READ" propagation="REQUIRED" read-only="true" />
            <tx:method name="transfer" isolation="REPEATABLE_READ" propagation="REQUIRED" read-only="false" />
        </tx:attributes>
    </tx:advice>
    <!-- 配置织入 -->
    <aop:config  >
        <!-- 配置切点表达式 -->
        <aop:pointcut expression="execution(* cn.swun.service.*ServiceImpl.*(..))" id="txPc"/>
        <!-- 配置切面 : 通知+切点
                 advice-ref:通知的名称
                 pointcut-ref:切点的名称
         -->
        <aop:advisor advice-ref="txAdvice" pointcut-ref="txPc" />
    </aop:config>

方式三:注解

首先开启注解管理aop事务,然后打注解

    <!-- 开启使用注解管理aop事务 -->
    <tx:annotation-driven/>
/*
* 该注解可以打在方法上,也可以打在类上
*/
@Transactional(isolation=Isolation.REPEATABLE_READ,propagation=Propagation.REQUIRED,readOnly=false)
public void transfer(final Integer from, final Integer to, final Float money) {
	accountDao.subMoney(from,money);
	int i = 1/0;
	accountDao.addMoney(to,money);
}

spring是如何控制事务的?

Spring 的事务,可以说是 Spring AOP 的一种实现。

AOP面向切面编程,即在不修改源代码的情况下,对原有功能进行扩展,通过代理类来对具体类进行操作。

spring是一个容器,通过spring这个容器来对对象进行管理,根据配置文件来实现spring对对象的管理。

spring的事务声明有两种方式,编程式和声明式。spring主要是通过“声明式事务”的方式对事务进行管理,即在配置文件中进行声明,通过AOP将事务切面切入程序,最大的好处是大大减少了代码量。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • SpringBoot打War包上传到阿里云的LINUX服务器的操作方法

    SpringBoot打War包上传到阿里云的LINUX服务器的操作方法

    这篇文章主要介绍了SpringBoot打War包上传到阿里云的LINUX服务器,本文通过图文并茂的形式给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-02-02
  • SPRING BOOT启动命令参数及源码详析

    SPRING BOOT启动命令参数及源码详析

    这篇文章主要给大家介绍了关于SPRING BOOT启动命令参数及源码分析的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用SPRING BOOT具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-12-12
  • 深入理解Java8新特性之新日期时间API的应用

    深入理解Java8新特性之新日期时间API的应用

    自从 14 年发布 Java 8 以后,我们古老 java.util.Date 终于不再是我们 Java 里操作日期时间的唯一的选择,其实 Java 里的日期时间的相关 API 一直为世猿诟病,今天我们来了解新的日期时间API是怎么使用吧
    2021-11-11
  • Java通过JsApi方式实现微信支付

    Java通过JsApi方式实现微信支付

    本文讲解了Java如何实现JsApi方式的微信支付,代码内容详细,文章思路清晰,需要的朋友可以参考下
    2015-07-07
  • Spring Boot报错:No session repository could be auto-configured, check your configuration的解决方法

    Spring Boot报错:No session repository could be auto-configured

    这篇文章主要给大家介绍了关于Spring Boot报错:No session repository could be auto-configured, check your configuration的解决方法,文中给出了详细的解决方法,对遇到这个问题的朋友们具有一定参考价值,需要的朋友下面来一起看看吧。
    2017-07-07
  • 编写Java代码对HDFS进行增删改查操作代码实例

    编写Java代码对HDFS进行增删改查操作代码实例

    这篇文章主要介绍了Java代码对HDFS进行增删改查操作,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-04-04
  • Spring Security源码解析之权限访问控制是如何做到的

    Spring Security源码解析之权限访问控制是如何做到的

    Spring Security 中对于权限控制默认已经提供了很多了,但是,一个优秀的框架必须具备良好的扩展性,下面小编给大家介绍Spring Security源码解析之权限访问控制是如何做到的,感兴趣的朋友跟随小编一起看看吧
    2021-05-05
  • Springboot+rabbitmq实现延时队列的两种方式

    Springboot+rabbitmq实现延时队列的两种方式

    这篇文章主要介绍了Springboot+rabbitmq实现延时队列的两种方式,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-05-05
  • SpringBoot与SpringMVC中参数传递的原理解析

    SpringBoot与SpringMVC中参数传递的原理解析

    这篇文章主要介绍了SpringBoot与SpringMVC中参数传递的原理,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-07-07
  • Java设计模式中责任链模式详解

    Java设计模式中责任链模式详解

    责任链模式是将链中的每一个节点看做是一个对象,每个节点处理的请求均不相同,且内部自动维护下一个节点对象,当一个请求从链式的首段发出时,会沿着链的路径依次传递给每一个节点对象。本文将通过示例和大家详细聊聊责任链模式,需要的可以参考一下
    2022-11-11

最新评论