Spring总结十:事务案例
数据库表Account:

导包:
<dependencies>
<!--测试-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
</dependency>
<!--mysql-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
</dependency>
<!--连接池-->
<dependency>
<groupId>c3p0</groupId>
<artifactId>c3p0</artifactId>
<version>0.9.1.2</version>
</dependency>
<!--spring-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
</dependency>
<!--日志-->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
</dependency>
</dependencies>
tx,aop配置声名式事务:
首先编写我们的dao和service代码:
public class AccountDao extends JdbcDaoSupport {
//出账
public void rollout(String name, double money) {
String sql = "update account set money=money-? where name=?";
super.getJdbcTemplate().update(sql, money, name);
}
//入账
public void shiftto(String name, double money) {
String sql = "update account set money=money+? where name=?";
super.getJdbcTemplate().update(sql, money, name);
}
}
public class AccountService {
private AccountDao accountDao;
public void setAccountDao(AccountDao accountDao) {
this.accountDao = accountDao;
}
//转账
public void transfer(String outName, String inName, double money) {
accountDao.rollout(outName, money);
//int i = 1 / 0;
accountDao.shiftto(inName, money);
}
}
添加数据库配置文件jdbc.properties:
jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://127.0.0.1:3306/temp_db?useUnicode=true&characterEncoding=utf8&autoReconnect=true\
&allowMultiQueries=true
jdbc.username=root
jdbc.password=root
添加并配置spring配置文件applicationContext.xml:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd
">
<!--关联jdbc配置文件-->
<context:property-placeholder location="classpath:jdbc.properties"></context:property-placeholder>
<!--配置c3p0连接池-->
<bean id="c3p0DataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass" value="${jdbc.driverClassName}"/>
<property name="jdbcUrl" value="${jdbc.url}"/>
<property name="user" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</bean>
<!--dao和service-->
<bean id="accountDao" class="com.zy.dao.AccountDao">
<!--由于我们的AccountDao继承了JdbcDaoSupport 所以跳过jdbcTemplate 直接设置datasource-->
<property name="dataSource" ref="c3p0DataSource"></property>
</bean>
<bean id="accountService" class="com.zy.service.AccountService">
<property name="accountDao" ref="accountDao"></property>
</bean> <!--定义事务管理器(声明式的事务)-->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="c3p0DataSource"></property>
</bean>
<!--tx标签配置的拦截器 底层依赖aop环绕通知 所以下面会配置aop切入点和切面-->
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<!-- 配置事务管理属性,TransactionDefinition -->
<!--
name 方法名
isolation 隔离级别 默认DEFAULT
propagation 传播行为 默认 REQUIRED
timeout 超时时间 默认 -1 不超时
read-only 是否只读 默认false 不是只读
rollback-for 配置一些异常,发生这些异常事务进行回滚
no-rollback-for 配置一些异常,发生这些异常,将被忽略,事务仍然进行提交
-->
<!--我们拦截的方法是转账方法 transfer-->
<tx:method name="transfer"/>
</tx:attributes>
</tx:advice> <!--配置切入点和切面-->
<aop:config proxy-target-class="false">
<aop:advisor advice-ref="txAdvice" pointcut="bean(*Service)"></aop:advisor>
</aop:config>
</beans>
测试代码:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = "classpath:applicationContext.xml")
public class AccountServiceTest { @Value("#{accountService}")
AccountService accountService; @Test
public void transfer() throws Exception {
accountService.transfer("张学友", "刘德华", 100);
} }
使用@Transactional注解进行声明式事务管理:
需要加事务的方法上加上注解:
public class AccountService {
private AccountDao accountDao;
public void setAccountDao(AccountDao accountDao) {
this.accountDao = accountDao;
}
//转账
@Transactional
public void transfer(String outName, String inName, double money) {
accountDao.rollout(outName, money);
accountDao.shiftto(inName, money);
}
}
applicationContext.xml修改如下:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd
">
<!--关联jdbc配置文件-->
<context:property-placeholder location="classpath:jdbc.properties"></context:property-placeholder>
<!--配置c3p0连接池-->
<bean id="c3p0DataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass" value="${jdbc.driverClassName}"/>
<property name="jdbcUrl" value="${jdbc.url}"/>
<property name="user" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</bean>
<!--dao和service-->
<bean id="accountDao" class="com.zy.dao.AccountDao">
<!--由于我们的AccountDao继承了JdbcDaoSupport 所以跳过jdbcTemplate 直接设置datasource-->
<property name="dataSource" ref="c3p0DataSource"></property>
</bean>
<bean id="accountService" class="com.zy.service.AccountService">
<property name="accountDao" ref="accountDao"></property>
</bean> <!--<!–定义事务管理器(声明式的事务)–>-->
<!--<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">-->
<!--<property name="dataSource" ref="c3p0DataSource"></property>-->
<!--</bean>-->
<!--<!–tx标签配置的拦截器 底层依赖aop环绕通知 所以下面会配置aop切入点和切面–>-->
<!--<tx:advice id="txAdvice" transaction-manager="transactionManager">-->
<!--<tx:attributes>-->
<!--<!– 配置事务管理属性,TransactionDefinition –>-->
<!--<!–-->
<!--name 方法名-->
<!--isolation 隔离级别 默认DEFAULT-->
<!--propagation 传播行为 默认 REQUIRED-->
<!--timeout 超时时间 默认 -1 不超时-->
<!--read-only 是否只读 默认false 不是只读-->
<!--rollback-for 配置一些异常,发生这些异常事务进行回滚-->
<!--no-rollback-for 配置一些异常,发生这些异常,将被忽略,事务仍然进行提交-->
<!--–>-->
<!--<!–我们拦截的方法是转账方法 transfer–>-->
<!--<tx:method name="transfer"/>-->
<!--</tx:attributes>-->
<!--</tx:advice>--> <!--<!–配置切入点和切面–>-->
<!--<aop:config proxy-target-class="false">-->
<!--<aop:advisor advice-ref="txAdvice" pointcut="bean(*Service)"></aop:advisor>-->
<!--</aop:config>--> <!--增加注解版 事务管理器-->
<tx:annotation-driven transaction-manager="transactionManager"></tx:annotation-driven> <!--事务通知依赖于 事务管理器-->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="c3p0DataSource"></property>
</bean>
</beans>
ok
Spring总结十:事务案例的更多相关文章
- Spring+springmvc+Mybatis整合案例 annotation版(myeclipse)详细版
Spring+springmvc+Mybatis整合案例 Version:annotation版 文档结构图: 从底层开始做起: 01.配置web.xml文件 <?xml version=&qu ...
- Spring+springmvc+Mybatis整合案例 xml配置版(myeclipse)详细版
Spring+springmvc+Mybatis整合案例 Version:xml版(myeclipse) 文档结构图: 从底层开始做起: 01.配置web.xml文件 <?xml version ...
- Spring五个事务隔离级别和七个事务传播行为
详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt216 Spring五个事务隔离级别和七个事务传播行为 1. 脏读 :脏读就是 ...
- spring中aop事务
一.事务 二.spring封装了事务管理代码 1.事务操作 2.事务操作对象 (1)因为在不同平台,操作事务的代码各不相同.spring提供了一个接口 (2) PlatformTransactionM ...
- Spring Boot(十四):spring boot整合shiro-登录认证和权限管理
Spring Boot(十四):spring boot整合shiro-登录认证和权限管理 使用Spring Boot集成Apache Shiro.安全应该是互联网公司的一道生命线,几乎任何的公司都会涉 ...
- Java基础-SSM之Spring和Mybatis整合案例
Java基础-SSM之Spring和Mybatis整合案例 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 在之前我分享过mybatis和Spring的配置案例,想必大家对它们的 ...
- Spring 框架的事务管理
1. Spring 框架的事务管理相关的类和API PlateformTransactionManager 接口: 平台事务管理器(真正管理事务的类); TransactionDefinition 接 ...
- (转)使用Spring配置文件实现事务管理
http://blog.csdn.net/yerenyuan_pku/article/details/52886207 前面我们讲解了使用Spring注解方式来管理事务,现在我们就来学习使用Sprin ...
- Spring框架之事务管理
Spring框架之事务管理 一.事务的作用 将若干的数据库操作作为一个整体控制,一起成功或一起失败. 原子性:指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生. 一致性:指事务前后 ...
- (三)Spring框架之事务管理
一.编程式事务管理 Spring事务管理器的接口是org.springframework.transaction.PlatformTransactionManager,事务管理器接口PlatformT ...
随机推荐
- android官网被封掉了,只好用这个网站进谷歌了!嘎嘎
http://developer.android.com/sdk/index.html 这个可以进去,但是必须是搜狐 .360,uc都不用特意FQ http://173.1 ...
- C++纯虚函数实现
纯虚函数就是一个在基类中的虚函数,差别只是在一般的虚函数声明的后面加了"=0",虚函数允许函数通过与函数体之间的联系在运行时才建立,也就是在运行时才决定如何动作,称为运行时的多态性 ...
- Is possible develop iOS game with Delphi Xe4 ? Pascal
下面的计划: 评估用Delphi XE4来开发游戏的可行性. 以及成本. (代价过大的话 估计还是不会被接受 所以某个角度来说这是个玩具) . 有几个选择, Asphyre 4.0 之后作者lifep ...
- 在javascript中使用提示信息来熟悉当前的程序流程
最近,因为需要,开始了解javascript,这个对我来说是个新的东西,在分析现有程序的功能的时候,需要增加一些提示信息来帮助了解程序的处理流程.于是在网上了解了一下提示信息的使用和区别.在此整理一下 ...
- 转载Verilog乘法器
1. 串行乘法器 两个N位二进制数x.y的乘积用简单的方法计算就是利用移位操作来实现. module multi_CX(clk, x, y, result); input clk; input [7: ...
- BZOJ3214 [Zjoi2013]丽洁体
题意 平时的练习和考试中,我们经常会碰上这样的题:命题人给出一个例句,要我们类比着写句子.这种往往被称为仿写的题,不单单出现在小学生的考试中,也有时会出现在中考中.许多同学都喜欢做这种题,因为较其它题 ...
- 一分钟理解js闭包
什么是闭包?先看一段代码: ? 1 2 3 4 5 6 7 8 9 10 function a(){ var n = 0; function inc() { n++; cons ...
- PCB 锣板和半孔工艺的差别
PCB 锣板和半孔工艺的差别 PCB 在做模块时会用到半孔工艺,但是由于半孔是特殊工艺. 需要加费用,打板时费还不低. 下面这个图是锣板和半孔工艺的差别. https://www.amobbs.com ...
- 不常用的linux命令
不太常用的命令 vipw ##打开密码配置文件 dmesg ##补充说明:kernel会将开机信息存储在ring buffer中.您若是开机时来不及查看信息,可利用dme ...
- DHCP(三)
选择阶段:即DHCP客户端选择IP地址的阶段.如果有多台DHCP服务器向该客户端发来DHCP Offer报文,客户端只接受第一个收到的DHCP Offer报文,然后以广播方式发送DHCP Reques ...