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的声明式事务管理。

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

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