spring编程式事务处理,spring编程事务,详解Spring学习之编程式事务管理

spring编程式事务处理,spring编程事务,详解Spring学习之编程式事务管理

本文主要详细介绍Spring learning的程序化事务管理。边肖认为这很好。现在分享给大家,给大家一个参考。来和边肖一起看看吧。

前言

在前面的内容中,我们已经基本学习了事务的基本概念和事务隔离的级别等。在接下来的几节中,我们将学习如何使用Spring进行事务管理。在Spring中,管理事务的方式有很多种,主要是编程式和声明式。本节主要研究编程式事务管理,后面研究Spring的声明式事务管理。

编程式事务管理

所谓程序化事务管理,其实就是通过编写代码来管理事务,也就是将事务管理代码硬编码在代码中,从而实现事务管理的功能。然而,Spring的事务管理不同于JDBC最初的事务管理。在JDBC中,要管理事务,首先要关闭自动提交,然后采用手动配置来控制提交和异常情况下的回滚。在Spring中,Spring的接口主要用于管理,如下面的代码所示。

这里模拟银行转账的业务。我们知道,转账其实就是把一个账户的金额减去,把相应的金额增加到另一个账户。

Spring配置文件

?xml版本='1.0 '编码='UTF-8 '?

beans xmlns=' http://www . spring framework . org/schema/beans '

xmlns:xsi=' http://www . w3 . org/2001/XML schema-instance '

xsi:schema location=' http://www . spring framework . org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd'

!-打开自动扫描-

context:component-scan base-package=' cn . Xu huanfeng . transaction '/

!-使用dbcp配置数据源-此处-

bean id=' data source ' class=' org . Apache . commons . dbcp . basic data source '

属性名='url '值=' JDBC:MySQL://localhost:3306/spring '/

属性名='driverClassName '值='com.mysql.jdbc.Driver'/

属性名='用户名'值='根'/

property name=' password ' value=' Huan feng '/

/bean

!-配置JdbcTemplate -

bean id=' JDBC template ' class=' org . spring framework . JDBC . core . JDBC template '

!-注入数据源-

属性名='dataSource' ref='dataSource'/

/bean

!-配置事务管理-

bean id=' transaction manager ' class=' org . spring framework . JDBC . data source . data source transactionManager '

!-注入数据源-

属性名='dataSource' ref='dataSource'/

/bean

!-配置事务管理操作类-

bean id=' transaction template ' class=' org . spring framework . transaction . support . transaction template '

!注入交易管理

属性名称=' transaction manager ' ref=' transaction manager '/

!-定义事务隔离级别,其中-1表示默认值-

属性名称='isolationLevel '值='-1'/

!-配置传播行为,0表示传播_必需-

属性名称='propagationBehavior '值='0'/

!-因为读写操作,这里的只读设置为false,默认也是false,所以没必要设置-

属性名称='readOnly '值='false'/

/bean

/豆子

在配置事务隔离级别的时候,因为是整数的形式而不是字符串的形式,所以一开始有点疑惑。后来查了对应的源代码,找到了对应的常数,记录如下。

//事务传播行为

int PROPAGATION _ REQUIRED=0;

int PROPAGATION _ SUPPORTS=1;

int PROPAGATION _ MANDATORY=2;

int PROPAGATION _ REQUIRES _ NEW=3;

int PROPAGATION _ NOT _ SUPPORTED=4;

int PROPAGATION _ NEVER=5;

int PROPAGATION _ NESTED=6;

//事务隔离级别

int ISOLATION _ DEFAULT=-1;

int ISOLATION _ READ _ UNCOMMITTED=1;

int ISOLATION _ READ _ COMMITTED=2;

int ISOLATION _ REPEATABLE _ READ=4;

int ISOLATION _ SERIALIZABLE=8;

int time out _ DEFAULT=-1;

持久层代码如下

@仓库

公共类帐户Dao {

@自动连线

私有JdbcTemplate jdbcTemplate

public void transfer in(String name,double money){

String sql='更新账套钱=钱?其中name=?';

jdbcTemplate.update(sql,money,name);

}

公共void转出(字符串名,双币){

String sql='更新账套钱=钱-?其中name=?';

jdbcTemplate.update(sql,money,name);

}

}

业务层代码如下

@服务

公共类AccountService {

@自动连线

私人帐户Dao帐户Dao;

//转账

public void transfer(String from name,String toName,double money){

account Dao . transfer out(from name,money);

accountDao.transferIn(toName,money);

}

}

通过对业务层代码的检查和测试,可以看到结果是没有问题的,即传输成功。

如果业务代码执行中出现错误或异常,结果会是什么?

例如,通过修改转移代码来手动模拟异常,如下所示

account Dao . transfer out(from name,money);

int d=1/0;//除以0时出现异常

accountDao.transferIn(toName,money);

此时运行测试代码,可以发现数据不一致,金额已经转出。但是由于转入前出现异常,无法转入,导致部分金额莫名其妙的丢失,这就是为什么需要交易管理的原因。

将事务管理添加到业务层代码中,如下所示

@服务

公共类AccountService {

@自动连线

私人帐户Dao帐户Dao;

//配置事务管理操作类

@自动连线

私有transaction template transaction template;

公共无效转移(最终字符串fromName,最终字符串toName,最终double money){

//通过transactionTemplate管理事务

transaction template . execute(new transactioncallbackwithouresult(){

@覆盖

受保护的void dointransactionwithouttresult(transaction status transaction status){

account Dao . transfer out(from name,money);

int d=1/0;//除以0时出现异常

accountDao.transferIn(toName,money);

}

});

}

}

当代码再次运行时,可以发现无论有无异常,数据的一致性都是有保证的,也就是说事务管理起了作用。

以上内容是使用Spring进行事务管理的一种方式,但是这种方式并不是很方便,因为除了配置事务管理操作类,也就是TransactionTemplate之外,在需要进行事务管理的时候,需要在相应的代码中编写相应的管理代码,如上图所示,所以这种方式在日常开发中很少使用。

总结

本节主要学习如何在Spring中配置事务管理器,通过编码使用Spring的程序化事务管理来管理业务操作。但是这种方法用起来不是很方便,所以很少用。在下一节中,我们将学习Spring的声明式事务管理。

这就是本文的全部内容。希望对大家的学习有帮助,支持我们。

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: