本文主要详细介绍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的声明式事务管理。
这就是本文的全部内容。希望对大家的学习有帮助,支持我们。