本文主要详细介绍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的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。