Spring基于Annotation实现事务管理

在 Spring 中,除了使用基于 XML 的方式可以实现声明式事务管理以外,还可以通过 Annotation 注解的方式实现声明式事务管理。

使用 Annotation 的方式非常简单,只需要在项目中做两件事,具体如下。
1 在 Spring 容器中注册驱动,代码如下所示

<tx:annotation-driven transaction-manager="txManager"/>

2 在需要使用事务的业务类或者方法中添加注解 @Transactional,并配置 @Transactional 的参数。关于 @Transactional 的参数如下图所示。
在这里插入图片描述

下面通过修改Spring声明式事务管理(点击跳转至Spring声明式事务管理)中银行转账的案例讲解如何使用 Annotation 注解的方式实现 Spring 声明式事务管理。

1. 注册驱动
修改 Spring 配置文件 applicationContext.xml,修改后如下所示。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:context="http://www.springframework.org/schema/context"xmlns:tx="http://www.springframework.org/schema/tx"xmlns:aop="http://www.springframework.org/schema/aop"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans-2.5.xsd  http://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context.xsdhttp://www.springframework.org/schema/txhttp://www.springframework.org/schema/tx/spring-tx-2.5.xsdhttp://www.springframework.org/schema/aophttp://www.springframework.org/schema/aop/spring-aop-2.5.xsd"><!-- 加载properties文件 --><context:property-placeholder location="classpath:c3p0-db.properties" /><!-- 配置数据源,读取properties文件信息 --><bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"><property name="driverClass" value="${jdbc.driverClass}" /><property name="jdbcUrl" value="${jdbc.jdbcUrl}" /><property name="user" value="${jdbc.user}" /><property name="password" value="${jdbc.password}" /></bean><!-- 配置jdbc模板 --><bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"><property name="dataSource" ref="dataSource" /></bean><!-- 配置dao --><bean id="accountDao" class="com.mengma.dao.impl.AccountDaoImpl"><property name="jdbcTemplate" ref="jdbcTemplate" /></bean><!-- 配置service --><bean id="accountService" class="com.mengma.service.impl.AccountServiceImpl"><property name="accountDao" ref="accountDao" /></bean><!-- 事务管理器,依赖于数据源 --><bean id="txManager"class="org.springframework.jdbc.datasource.DataSourceTransactionManager"><property name="dataSource" ref="dataSource" /></bean><!-- 注册事务管理驱动 --><tx:annotation-driven transaction-manager="txManager"/>
</beans>

上述代码中可以看出,与原来的配置文件相比,这里只修改了事务管理器部分,新添加并注册了事务管理器的驱动。

注意,在学习 AOP 注解方式开发时,需要在配置文件中开启注解处理器,指定扫描哪些包下的注解,这里没有开启注解处理器是因为在第 33~35 行手动配置了 AccountServiceImpl,而 @Transactional 注解就配置在该类中,所以会直接生效。

2. 添加 @Transactional 注解
修改 AccountServiceImpl,在文件中添加 @Transactional 注解及参数,添加后如下所示。

package com.mengma.service.impl;import org.springframework.transaction.annotation.Isolation;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;import com.mengma.dao.AccountDao;@Transactional(propagation = Propagation.REQUIRED, isolation = Isolation.DEFAULT, readOnly = false)
public class AccountServiceImpl {private AccountDao accountDao;public void setAccountDao(AccountDao accountDao) {this.accountDao = accountDao;}public void transfer(String outUser, String inUser, int money) {this.accountDao.out(outUser, money);// 模拟断电int i = 1 / 0;this.accountDao.in(inUser, money);}
}

注意,在使用 @Transactional 注解时,参数之间用“,”进行分隔。

使用 JUnit 测试再次运行 test() 方法时,控制台同样会输出如下图所示的异常信息,这说明使用基于 Annotation 注解的方式同样实现了 Spring 的声明式事务管理。如果注释掉模拟断电的代码进行测试,则转账操作可以正常完成。
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/564485.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python扩展,用python扩展列

我试图在python中扩展数据帧的某一列。在r中,我将使用这个函数:在python中,我发现df.pivot_table(),但我刚发现一个错误:pandas.pivot_table(df, values Value, index[Day, Money, Product],columns[Account])^更新结果:数据帧没有更改。它只返回相同的数据文件而不进行扩展。考…

基于matlab的pcm系统仿真_深入理解基于RISC-V ISS Spike的仿真系统:探索Spike,pk和fesrv...

Spike, the RISC-V ISA Simulator, implements a functional model of one or more RISC-V processors.Spike is named after the golden spike used to celebrate the completion of the US transcontinental railway.一些同学初接触RISC-V&#xff0c;总逃脱不了被Rocketchip…

单机安装oracle,单机安装oracle系统

一、安装oracle6.9操作系统1、硬盘划分为30G(以下分区皆强制为主分区)/boot 200Mswap 4G/ 剩余全部空间安装下一步的步骤就不说了勾选图形选项基本系统--》备份客户端&#xff0c;大系统性能&#xff0c;存储工具&#xff0c;安全工具&#xff0c;性能工具&#xff0c;目录客户…

redis timeout设置多少合适_热水器怎么调温度?一般热水器温度设置多少度比较合适?...

对于热水器的温度设置您知道怎么操作吗&#xff1f;一般情况下电热水器设置多少度比较合适呢&#xff1f;今天蜜罐蚁装修网小编给大家介绍下热水器如何调节温度&#xff0c;以及热水器调节温度在什么范围比较合适。下面请看小编以美的电热水器某个型号产品举例图文讲解热水器调…

用swing设计一个打地鼠小游戏_这7个风靡欧美的英语小游戏,学会胜过刷100道题!...

精彩导读小编为大家搜罗了一些在国外家喻户晓的语言类小游戏。好的方法胜过刷上100道题&#xff0c;真正让孩子觉得好玩&#xff0c;教学才会事半功倍&#xff01;01Would You Rather...最近牛津大学的面试考题惊天地爆出了一题&#xff1a;你想要变成吸血鬼还是想要变成僵尸&a…

oracle数据库9i安装,Oracle 9i数据库服务器的安装和辅助软件安装教程

安装数据库服务器以Oracle 9i数据库服务器软件的安装过程为例&#xff0c;介绍数据库服务器的安装过程。14.3.1 安装数据库服务器系统环境数据库服务器安装之前&#xff0c;一般都需要检测系统安装环境&#xff0c;以避免系统不支持、内存不够、硬盘空间不足等情况发生。下面从…

oracle 触发器 行级,oracle的行级触发器使用

行级触发器&#xff1a;当触发器被触发时&#xff0c;要使用被插入、更新或删除的记录中的列值&#xff0c;有时要使用操作前、后列的值.:NEW 修饰符访问操作完成后列的值:OLD 修饰符访问操作完成前列的值例1: 建立一个触发器, 当职工表 emp 表被删除一条记录时&#xff0c;把被…

司铭宇老师:如何让企业销售培训效果落地

如何让企业销售培训效果落地 在企业销售培训中&#xff0c;我们经常听到一个词&#xff0c;那就是“落地”。所谓的“落地”&#xff0c;简单来说就是将培训中所学到的知识和技能转化为实际的工作行动&#xff0c;从而提高销售业绩。但是&#xff0c;如何才能让销售培训效果真…

linux 宽字符串,C语言中的多字节字符与宽字符

C语言原本是在英文环境中设计的&#xff0c;主要的字符集是7位的ASCII码&#xff0c;8位的byte(字节)是最常见的字符编码单位。但是国际化软件必须能够表示不同的字符&#xff0c;而这些字符数量庞大&#xff0c;无法使用一个字节编码。C95标准化了两种表示大型字符集的方法&am…

C++函数编译原理和成员函数的实现

C函数的编译 C中的函数在编译时会根据命名空间、类、参数签名等信息进行重新命名&#xff0c;形成新的函数名。这个重命名的过程是通过一个特殊的算法来实现的&#xff0c;称为 名字编码&#xff08;Name Mangling&#xff09;。 Name Mangling 是一种可逆的算法&#xff0c;…

linux 运行选择哪个cpu核,判断Linux进程在哪个CPU核运行的方法

问题&#xff1a;有一个Linux进程运行在多核处理器系统上&#xff0c;如何查看该进程运行在哪个CPU上&#xff1f;方法一&#xff1a;ps 命令可以告诉你每个进程/线程目前分配到的(在“PSR”列)CPU ID。ps -o pid,psr,comm -p 运行结果&#xff1a;PID PSR COMM5357 10 prog输…

C++对象数组

对象数组是什么 数组对象就是大批量实例化对象的一种方法&#xff0c;例如&#xff1a;Student stu 实例化对象&#xff0c;如果有好几百个对象应该怎么办&#xff1f;这时候就用到了对象数组&#xff0c;顾名思义&#xff0c;就是吧所有要实例化的对象都放到一个组里面&#…

镜像安装linux选择内核版本,在CentOS和Ubuntu中安装Linux Kernel 4.13.10

Linus Torvalds 在 10 月 17 日星期五正式发布了稳定版 Linux Kernel 4.13.10&#xff0c;这个最新版本发布了新功能&#xff0c;进行了诸多修复和问题改进。下面将向大家介绍在 CentOS 和 Ubuntu 中手动安装、更新 Linux Kernel 4.13.10 的方法&#xff0c;当然&#xff0c;这…

linux设备进入睡眠所需时间,android linux 休眠 深度睡眠 查看 方法 调试【转】

在Android移动设备中&#xff0c;有时按下Power键(未接电源&#xff0c;USB)时&#xff0c;因其它apk程序获取了wake_up锁未释放或程序BUG导致未释放&#xff0c;造成未能进入深度睡眠&#xff0c;从而加大了耗电量&#xff0c;减少了待机时间&#xff0c;参考如下图&#xff0…

linux qt5.9交叉编译,QT5.9移植

&#xff11;&#xff0e;下载&#xff31;&#xff54;源码Qt源码下载地址&#xff1a;Index of /archive/qt 其他源码和其他安装包都是有的。2&#xff0e;解压源码$ mkdir qt5.9$cd qt5.9将下载文件拷贝到当前目录下面。解压$ xz -d qt-everywhere-opensource-src-5.9.7.t…

linux wps 公式编辑器,WPS 2012数学公式编辑器的使用方法(详细图解)

做数学或物理课件时很多公式是件比较头痛的事。时常陷入无穷的拼接法中&#xff0c;用一个一个文本框组合成复杂的公式。其实WPS 2012e为我们提供了一个功能强大的公式编辑器Equation Editor&#xff0c;可以帮助我们解决这些问题。1、插入公式将光标放置于欲插入公式的位置&am…

linux客户端 存活检测,Linux下客户端检测服务器的 heartbeat

客户端代码&#xff0c;和一般的客户端不一样#include#include#include#include#include#include#include#include#include#include#include #include #define MAXDATASIZE 100int main(){int sockfd,nbytes,serv_port;char buf_serv_ip[16],buf[260];struct sockaddr_in serv_…

python object单引号变成双引号_Python学习第163课--Linux命令行中的单引号和双引号...

【每天几分钟&#xff0c;从零入门python编程的世界&#xff01;】我们都知道引号的作用就是为了引用&#xff0c;比如引用别人说的话&#xff0c;这句话就放在引号里面。而Linux命令行中的single quote(单引号)和dubble quote(双引号)有不同的作用。●双引号linux命令中双引号…

C语言条件循环语句执行步骤,C语言中for语句的执行过程是什么?

C语言中for语句的执行过程是&#xff1a;1、会先判断条件表达式是否成立&#xff0c;如果条件成立则执行中间循环体&#xff0c;执行完中间循环体后接着执行末尾循环体 &#xff1b;2、在执行完末尾循环体后对条件表达式再次判断&#xff0c;若条件还成立&#xff0c;则继续重复…

c语言规范标准中英文,C语言中英文翻译资料.doc

C语言中英文翻译资料.docThe C Programming LanguageC is a high-level programming language developed by Dennis Ritchie and Brian Kernighan at Bell Labs in the mid-1970s. Although originally designed as a systems programming language, C has proved to be a powe…