spring实现一个简单的事务管理
前两天给公司的数据库操作加了事务管理,今天博客就更一下这个吧。
先说明:本文只是简单得实现一下事务,事务的具体内容,比如事务的等级,事务的具体实现原理等等。。。 菜鸟水平有限,暂时还更不了这个,以后的博客可能会涉及。
如果您看完本博客之后能简单的实现一个事务,本文目的就达到了。
首先简单通俗的解释一下啥叫事务: 在一个方法里的所有操作数据库的语句,要么全部执行(方法没有报错),要么全部不执行(方法抛错,已经执行的语句回滚)。
xml形式实现事务,也是我在公司代码中实现的事务。他的好处是不用对现有代码进行任何修改,比较适合这种后期新加入的事务管理,缺点是可能会造成xml文件的庞大。
下面是xml中各个信息:
<context:property-placeholder location="classpath:jdbc.properties" />
该语句用于读取配置文件(数据库的用户名密码等)
<aop:config proxy-target-class="true"></aop:config>
强制使用CGLIB代理(暂时不知道为啥,不加这句我的代码会报错)
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> <property name="defaultAutoCommit" value="true" /> <property name="driverClassName" value="${driverClassName}" /> <property name="url" value="${url}" /> <property name="username" value="umetrip" /> <property name="password" value="${password}" /> </bean>
数据源,不解释!
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource" /> </bean>
注册事务,并指定事务处理的数据源
<!-- 注册数据库操作类 -->
<bean id="testDao" class="testSpring.business.Dao.iface.impl.TestDaoImpl"> <property name="dataSource" ref="dataSource" /> </bean> <bean id="dbTest1" class="testSpring.business.transaction.DbTest1"> <property name="testDao" ref="testDao" /> </bean> <aop:config> <aop:pointcut id="transactionPointcut" expression="execution(* testSpring.business.Dao.iface.impl..*.*(..))" /> <aop:advisor advice-ref="txAdvice" pointcut-ref="transactionPointcut" /> </aop:config>
注册事务的切入点。可以看到,事务是利用spring中的面向切面,向方法中注入事务管理。
其中expression="execution(* testSpring.business.Dao.iface.impl..*.*(..)) :
1、execution(): 表达式主体。
2、第一个*号:表示返回类型,*号表示所有的类型。
3、包名:表示需要拦截的包名,后面的两个句点表示当前包和当前包的所有子包,com.sample.service.impl包、子孙包下所有类的方法。
4、第二个*号:表示类名,*号表示所有的类。
5、*(..):最后这个星号表示方法名,*号表示所有的方法,后面括弧里面表示方法的参数,两个句点表示任何参数。
<tx:advice id="txAdvice" transaction-manager="transactionManager"> <tx:attributes> <!-- 如果方法是以get开头的方法,则不使用事务 --> <tx:method name="get*" read-only="true" propagation="NOT_SUPPORTED" /> <!-- 类中所有其他方法都使用事务管理 --> <tx:method name="*" /> </tx:attributes> </tx:advice>
为事务指定管理者并配置事务信息。
只需要配置xml文件即可,代码不用做任何修改。
测试代码:
//读取配置文件(将配置文件中的bean加载进内存) ApplicationContext ctx = new ClassPathXmlApplicationContext("/testSpring/resources/applicationContext_transaction.xml"); //获取的实例 DbTest1 bean = (DbTest1)ctx.getBean("dbTest1"); //调用方法 try{ bean.test(); }catch(Exception e){ e.printStackTrace(); }
TestDaoImpl类:
package testSpring.business.Dao.iface.impl; import javax.sql.DataSource; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.transaction.annotation.Propagation; import org.springframework.transaction.annotation.Transactional; import testSpring.business.Dao.iface.ITestDao; import testSpring.business.bean.TableBean; /** * ITestDao.java : * @author xuejupo jpxue@travelsky.com * create in 2016-2-16 下午5:04:56 */ public class TestDaoImpl implements ITestDao{ private JdbcTemplate jdbcTemplate; public void setDataSource(DataSource dataSource){ this.jdbcTemplate=new JdbcTemplate(dataSource); } @Override public void add(TableBean user) { // TODO Auto-generated method stub jdbcTemplate.update("insert into test values(?,?)", new Object[]{user.getId(),user.getName()}); this.del(1); jdbcTemplate.update("delete from test where id = ?",new Object[]{213123,2}); } @Override public void del(int id) { // TODO Auto-generated method stub jdbcTemplate.update("delete from test where id = ?",new Object[]{id}); } }
多次修改TestDaoImpl类的add代码并执行结果发现:add方法如果抛出异常,那么add方法内所有的sql语句都会回滚。但是如果add方法内没有发生异常或者异常被处理,那么add方法已经执行的sql语句就会被提交。
小结:
1.事务是针对某一个方法的,只要是在这个方法内抛错,这个方法内的所有数据库操作全部回滚(比如上面类中add方法里的del方法也会回滚)。
2.如果在进行事务管理的方法里将异常catch住并且写入log,而没有向外抛出,那么当前方法事务无效。。。解决方法是可以在写入log后向外抛出一个异常。
3.事务是很复杂的。。 不要看上面写的很简单。 比如事务的隔离等级,事务的锁表等级(行锁还是表锁,还有是否锁住索引等)。
PS:如果您看到的不是我的博客园的博客(爬虫的僵尸博客),欢迎到我的博客跟我一起讨论:http://www.cnblogs.com/xuejupo/
spring实现一个简单的事务管理的更多相关文章
- Spring 多数据源 @Transactional 注解事务管理
在 Spring,MyBatis 下两个数据源,通过 @Transactional 注解 配置简单的事务管理 spring-mybatis.xml <!--******************* ...
- 事务隔离级别与传播机制,spring+mybatis+atomikos实现分布式事务管理
1.事务的定义:事务是指多个操作单元组成的合集,多个单元操作是整体不可分割的,要么都操作不成功,要么都成功.其必须遵循四个原则(ACID). 原子性(Atomicity):即事务是不可分割的最小工作单 ...
- Spring事务隔离级别与传播机制详解,spring+mybatis+atomikos实现分布式事务管理
原创说明:本文为本人原创作品,绝非他处转载,转账请注明出处 1.事务的定义:事务是指多个操作单元组成的合集,多个单元操作是整体不可分割的,要么都操作不成功,要么都成功.其必须遵循四个原则(ACID). ...
- spring boot配置mybatis和事务管理
spring boot配置mybatis和事务管理 一.spring boot与mybatis的配置 1.首先,spring boot 配置mybatis需要的全部依赖如下: <!-- Spri ...
- [Winform]一个简单的账户管理工具
最近一直觉得注册的账户越来越多,帐号密码神马的容易弄混.自己就折腾了一个简单的账户管理工具,其实实现也挺简单,将每个账户的密码及相关密码提示信息,经aes算法加密之后保存到数据库,当前登录用户可以查询 ...
- Asp.NetMVC利用LigerUI搭建一个简单的后台管理详解(函登录验证)
上一篇 Asp.Net 中Grid详解两种方法使用LigerUI加载数据库数据填充数据分页 了解了LigerUI 中Grid的基本用法 现在结合上一篇的内容做一个简单的后台管理,当然也有前台的页面 ...
- Spring+Mybatis+MySql+Maven 简单的事务管理案例
利用Maven来管理项目中的JAR包,同时使用Spring在业务处理层进行事务管理.数据库使用MySq,数据处理层使用Spring和Mybatis结合. 本案例代码主要结构如图: 1.数据库脚本 -- ...
- spring boot一个简单用户管理DEMO
概述 该Demo旨在部署一个简单spring boot工程,包含数据编辑和查看功能 POM配置 <?xml version="1.0" encoding="UTF- ...
- spring+mybatis之声明式事务管理初识(小实例)
前几篇的文章都只是初步学习spring和mybatis框架,所写的实例也都非常简单,所进行的数据访问控制也都很简单,没有加入事务管理.这篇文章将初步接触事务管理. 1.事务管理 理解事务管理之前,先通 ...
随机推荐
- 一个linux 驱动升级的小问题记录
重复踩了两次坑,所以简单记录下. 内核 3.10. 在修改了驱动的gro实现之后,进行驱动版本的升级,make && make install 之后,发现tg3的驱动,没有生效. 相同 ...
- 二叉搜索树的第K大节点
题目描述 给定一颗二叉搜索树,请找出其中的第k大的结点. 分析 对二叉搜索树进行逆向中序遍历(先右再左),则遍历序列是降序排序的,因此中序遍历一颗二叉搜索树,可以很容易的得到它的第k大的节点.使用一个 ...
- python学习Day12 函数的默认值、三元表达式、函数对象(函数名)的应用场景、名称空间与作用域
复习 1.字符串的比较: -- 按照从左往右比较每一个字符,通过字符对应的ascii进行比较 2. 函数的参数 : 1)实参与形参: -- 形参:在函数定义时()中出现的参数 ...
- CSS 图像高级 径向渐变
径向渐变 径向渐变使用 radial-gradient 函数语法. 这个语法和线性渐变很类似, 可以指定渐变结束时的形状 以及它的大小. 默认来说,结束形状是一个椭圆形并且和容器的大小比例保持一致. ...
- [TestNG] [WARN] Ignoring duplicate listener : org.testng.IDEATestNGRemoteListenerEx
1. 使用6.10,和6.14.3版本testng,出现多条warn信息 [TestNG] [WARN] Ignoring duplicate listener : org.testng.IDEATe ...
- 云笔记项目- 上传文件报错"java.lang.IllegalStateException: File has been moved - cannot be read again"
在做文件上传时,当写入上传的文件到文件时,会报错“java.lang.IllegalStateException: File has been moved - cannot be read again ...
- 使用Dockerfile自定义一个包含centos,tomcat的镜像
1.首先建立一个专用的dockerfile目录,方便统一存放将要创建的Dockerfile文件及相关资源, 例如:mkdir mydockerself 2.定位到mydockerself路径下,下载l ...
- Flash AS3)actionScript代码制作文字渐变 + 描边
var sp:Sprite = new Sprite; //容器,放置稍后的渐变背景和文本框 this.addChild(sp); //容器添加到舞台 var maskMC:MovieClip = n ...
- [Solution] 893. Groups of Special-Equivalent Strings
Difficulty: Easy Problem You are given an array A of strings. Two strings S and T are special-equiva ...
- paloalto防火墙版本升级
1.准备工作:此部分不影响生产环境,可直接操作. 1)备份: 2)下载OS HA情况下,在主机下载完成后,选择 Sync To Peer(同步到对端)同步到备机. 2.安装更新 1)在备机上选择安装 ...