【Spring】Spring之事务处理
编程式事务
/**
* 1. 根据DataSource去创建事务管理器
* 构造方法 , 参数1. DataSource
*/
DataSourceTransactionManager txManager = new DataSourceTransactionManager(getDataSource());
/**
* 2. 创建事务模版对象, 并将事务管理器传递给模版
*/
TransactionTemplate ttlate = new TransactionTemplate(txManager); /**
* 3. 通过事务模版 , 执行事务, 并指定事务的回调函数
*/
Boolean flag = ttlate.execute(new TransactionCallback<Boolean>() { /**
* 我们要处理的JDBC操作, 可以放到这个方法中, 在这个方法里的所有JDBC操作, 将视为一个事务
*
* 这个方法, 如何认定事务是否应该提交 :
*
* 当方法中出现异常, 则表示事务执行失败 ,
* 如果异常进行了处理, 则事务执行成功!
*/
@Override
public Boolean doInTransaction(TransactionStatus status) {
try{ getJdbcTemplate().update("update book set bookname=? where bookid=?", "西游记",10002);
if(1==2){
throw new RuntimeException("停电了, 哈哈哈");
}
getJdbcTemplate().update("update book set bookname=? where bookid=?", "红楼梦",10003);
return true;
}catch(Exception e){
e.printStackTrace();
//处理了异常 , 没事了
//加入回滚标记 ( 本次事务不提交 )
status.setRollbackOnly();
return false; }
}
});
System.out.println("事务执行的结果:"+flag);
声明式事务
相较于编程式的事务 ,有利有弊 !
优点:
是一种aop的编程思想, 给一段代码添加事务, 无需修改原代码
缺点:
因为采用了注解, 注解的最小范围只能给类的成员 , 也就是说, 声明时的事务 ,最小的处理范围是一个方法 !
使用步骤:
1. 向容器中添加事务的管理对象
<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<constructor-arg index="0" ref="dataSource"></constructor-arg>
</bean> 2. 开启事务的扫描 , 指定事务管理器 <tx:annotation-driven transaction-manager="txManager" proxy-target-class="true"/> 3. 在具体要被执行事务的方法上, 添加注解@Transactional即可
@Transactional也可以添加到类上,表示对该类的所有方法使用事务
@Transactional注解的属性
@Transactional注解标记有以下属性,在使用时
可以根据需要做特殊设定。
propagation: 设置事务传播
isolation : 设置事务隔离级别
readOnly : 设置为只读,还是可读写
rollbackFor : 设置遇到哪些异常必须回滚
noRollbackFor : 设置遇到哪些异常不回滚
看一个Demo:
User类:
package cn.wxg.bean;
public class User {
private int id;
private String name;
private String password;
public User() {
super();
}
public int getId() {
return id;
}
public User(int id, String name, String password) {
super();
this.id = id;
this.name = name;
this.password = password;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
@Override
public String toString() {
return "User [id=" + id + ", name=" + name + ", password=" + password + "]";
}
}
User.java
Dao类:
package cn.wxg.dao; import java.util.List; import org.springframework.jdbc.core.support.JdbcDaoSupport;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.transaction.TransactionStatus;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.transaction.support.TransactionCallback;
import org.springframework.transaction.support.TransactionTemplate; import cn.wxg.bean.User; public class UserDao extends JdbcDaoSupport { @Transactional
public void test2(List<User> user){
String sql1="update test_user set password=? where name=?";
String sql2="update test_user set password=? where name=?"; getJdbcTemplate().update(sql1, user.get(0).getPassword(),user.get(0).getName());
getJdbcTemplate().update(sql2, user.get(1).getPassword(),user.get(1).getName());
} public boolean updateUser(List<User> user){
String sql1="update test_user set password=? where name=?";
String sql2="update test_user set password=? where name=?"; //声明事务管理组件
DataSourceTransactionManager dstt = new
DataSourceTransactionManager(getDataSource());
//声明事务组件
TransactionTemplate tt = new
TransactionTemplate(dstt);
//执行事务
Boolean res = tt.execute(new TransactionCallback<Boolean>(){ @Override
public Boolean doInTransaction(TransactionStatus status){
try{
getJdbcTemplate().update(sql1, user.get(0).getPassword(),user.get(0).getName());
getJdbcTemplate().update(sql2, user.get(1).getPassword(),user.get(1).getName());
return true;
}catch(Exception e){
status.setRollbackOnly();//回滚
}
return false;
}
});
return res;
}
}
UserDao
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:jdbc="http://www.springframework.org/schema/jdbc"
xmlns:jee="http://www.springframework.org/schema/jee"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:util="http://www.springframework.org/schema/util"
xmlns:jpa="http://www.springframework.org/schema/data/jpa"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.1.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.1.xsd
http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc-4.1.xsd
http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-4.1.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.1.xsd
http://www.springframework.org/schema/data/jpa http://www.springframework.org/schema/data/jpa/spring-jpa-1.3.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.1.xsd
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.1.xsd
http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.1.xsd"> <bean id="database" class="org.apache.commons.dbcp.BasicDataSource">
<!-- 驱动地址 -->
<property name="driverClassName" value="oracle.jdbc.OracleDriver"></property>
<!-- 数据库的连接地址 -->
<property name="url" value="jdbc:oracle:thin:@localhost:1521:xe"></property>
<!-- 数据库的帐号 -->
<property name="username" value="system"></property>
<!-- 数据库的密码 -->
<property name="password" value="517839"></property>
</bean> <bean id="userDao" class="cn.wxg.dao.UserDao">
<!--
在调用set方法进行赋值,
Spring容器是通过反射技术 ,根据我们传递的name参数 , 得到对应的set方法名称, 将其调用
-->
<property name="dataSource" ref="database"></property>
</bean> <!--配置DataSourceTransactionManager,事务管理着对象|-->
<bean id="txManage" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<constructor-arg index="0" ref="database"></constructor-arg>
</bean> <!--开启事务扫描-->
<tx:annotation-driven transaction-manager="txManage" proxy-target-class="true"/>
<!--文件扫描-->
<context:component-scan base-package="cn"></context:component-scan> </beans>
applicationContext.xml
测试类:
package cn.wxg.text; import java.util.ArrayList;
import java.util.List; import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext; import cn.wxg.bean.User;
import cn.wxg.dao.UserDao; public class UserDaoTest { @Test
public void testName1() throws Exception {
//加载配置文件
ApplicationContext ac=new ClassPathXmlApplicationContext("applicationContext.xml");
UserDao userDao = ac.getBean("userDao", UserDao.class);
User user1=new User(1001,"jame","987654321");
User user2=new User(1002,"locy","987654321");
List<User> users=new ArrayList<User>();
users.add(user1);
users.add(user2);
// System.out.println(userDao.updateUser(users));
userDao.test2(users); }
}
UserDaoTest.java
【Spring】Spring之事务处理的更多相关文章
- hibernate整合进spring后的事务处理
单独使用hibernate处理事务 本来只用hibernate开发,从而可以省了DAO层实现数据库访问和跨数据库,也可以对代码进行更好的封装,当我们web中单独使用hibernate时,我们需要单独的 ...
- Java面试题(设计模式篇+Spring/Spring MVC篇)
设计模式 88.说一下你熟悉的设计模式? 自行熟悉. 89.简单工厂和抽象工厂有什么区别? 简单理解简单工厂:对 一个对象的创建进行封装.抽象工厂:对 一组对象的创建进行封装. 比如生产 陶瓷马 和 ...
- spring + spring mvc + tomcat 面试题(史上最全)
文章很长,而且持续更新,建议收藏起来,慢慢读! 高并发 发烧友社群:疯狂创客圈(总入口) 奉上以下珍贵的学习资源: 疯狂创客圈 经典图书 : 极致经典 + 社群大片好评 < Java 高并发 三 ...
- spring spring data jpa save操作事务
整合spring spring data jpa的时候,在save方法上加了@Transactional注解.此时调用springdatajpa save方法并不会真的把数据提交给数据库,而是缓存起来 ...
- 基于Spring + Spring MVC + Mybatis + shiro 高性能web构建
一直想写这篇文章,前段时间 痴迷于JavaScript.NodeJs.AngularJS,做了大量的研究,对前后端交互有了更深层次的认识. 今天抽个时间写这篇文章,我有预感,这将是一篇很详细的文章,详 ...
- spring + spring mvc + mybatis + react + reflux + webpack Web工程例子
前言 最近写了个Java Web工程demo,使用maven构建: 后端使用spring + spring mvc + mybatis: 前端使用react + react-router+ webpa ...
- [转]基于Spring + Spring MVC + Mybatis 高性能web构建
http://blog.csdn.net/zoutongyuan/article/details/41379851/ 一直想写这篇文章,前段时间 痴迷于JavaScript.NodeJs.Angula ...
- Spring+Spring MVC+MyBatis
Spring+Spring MVC+MyBatis 目录 一.新建一个基于Maven的Web项目 二.创建数据库与表 三.添加依赖包 四.新建POJO实体层 五.新建MyBatis SQL映射层 六. ...
- MyBatis+Spring+Spring MVC整合开发
MyBatis+Spring+Spring MVC整合开发课程观看地址:http://www.xuetuwuyou.com/course/65课程出自学途无忧网:http://www.xuetuwuy ...
- 基于Spring + Spring MVC + Mybatis 高性能web构建
基于Spring + Spring MVC + Mybatis 高性能web构建 一直想写这篇文章,前段时间 痴迷于JavaScript.NodeJs.AngularJs,做了大量的研究,对前后端交互 ...
随机推荐
- [Functional Programming] Running though a serial number prediction functions for tagging, pairing the result into object
Let's we have some prediction functions, for each prediction function has a corresponding tag: const ...
- 国内A股16家上市银行的財务数据与股价的因子分析报告(1)(工具:R)
分析人:BUPT_LX 研究目的 用某些算法对2014年12月份的16家国内A股上市的商业银行当中11项財务数据(资产总计.负债合计.股本.营业收入.流通股A.少数股东权益.净利润.经营活动的现金流量 ...
- 浮动闭合最佳方案:clearfix
之前给大家介绍两种浮动闭合的办法CSS清除浮动 万能float闭合,得知很多同学都在使用下面的骨灰级解决办法: .clear{clear:both;height:0;overflow:hidden;} ...
- Android Volley 库的使用
本文内容 什么是 Volley 库 Volley 能做什么 Volley 架构 环境 演示 Volley 库的使用 参考资料 Android 关于网络操作一般都会介绍 HttpClient 以及 Ht ...
- C/C++中的值传递,引用传递,指针传递,指针引用传递
在面试过程中,被面试官问到传值和传引用的区别,之前没有关注过这个问题,今天在网上找了一篇包含代码和图片的讲解文章,浅显易懂,遂转载备忘. 1. 值传递 void f( int p){ printf(& ...
- SQL Server从BAK文件还原新的数据库
同一个数据库多个副本 很多时候,比如为了方便测试,排查问题,我们常常会拿到问题系统的数据库备份来开发环境下debug,这个时候就会出现同一个数据库的多个副本. 还原法 还原到一个新建的空数据库,在选项 ...
- Exchanger的使用
两个线程可以交换对象的同步点.每个线程都在进入 exchange 方法时给出某个对象,并接受其他线程返回时给出的对象. 用于实现两个人之间的数据交换,每个人在完成一定的事务后想与对方交换数据,第一个先 ...
- 再次编译 arm toolchains
为什么说再呢,因为已经好多次了.每次失败,都再从失败的地方开始.今天这篇呢,主要是记录今天的进展. 1. 编译要分三步走 之前学习的时候就有印象,要三步走.但是因为没有实践过,所以,忘差不多了.所谓三 ...
- dpkg: warning: files list file for package `*****' missing, assuming package has no files currently installed解决办法
一个好友的国外VPS由于操作不当,结果装软件的时候总是提示dpkg: warning: files list file for package `*****' missing, assuming pa ...
- LeetCode222 Count CompleteTree Nodes(计算全然二叉树的节点数) Java 题解
题目: Given a complete binary tree, count the number of nodes. Definition of a complete binary tree fr ...