9.spring:事务管理(下):声明式事务管理
声明式事务管理
sprin的声明式事务是管理AOP技术实现的事务管理,其本质是是对方法前后进行拦截,然后
在目标方法开始之前创建或者加入一个事务,在执行完成目标方法之后根据执行情况提交或者回滚事务。
声明式事务管理优点:不需要通过编程的方式管理事务,因而不需要在业务逻辑代码中掺杂事务处理的代码,
只需相关的事务规则声明便可以将事务规则应用到业务逻辑中。
在开发中使用声明式事务处理不仅因为其简单,更主要是这样可以使纯业务代码不被污染,方便后期的维护。
声明式事务管理不足之处:是最细粒纯度只能作用到方法级别,无法做到像编程事务管理那样作用到代码块级别。
spring的声明式事务管理可以通过两种方式实现:1、xml配置方式 2、使用@Transactionl注解方式
1).xml配置方式
public interface TestDao { public int save(String sql,Object p []);
public int delete(String sql,Object p []);
}
@Repository("TestDao")
public class TestDaoImpl implements TestDao{ @Autowired
private JdbcTemplate jdbcTemplate ; @Override
public int save(String sql, Object[] p) { return jdbcTemplate.update(sql, p);
} @Override
public int delete(String sql, Object[] p) {
// TODO Auto-generated method stub
return jdbcTemplate.update(sql, p);
}
}
public interface TestService { public int save(String sql,Object p []);
public int delete(String sql,Object p []);
}
@Service("TestService")
public class TestServiceImpl implements TestService{ @Autowired
private TestDao testDao ; @Override
public int save(String sql, Object[] p) { return testDao.save(sql, p);
} @Override
public int delete(String sql, Object[] p) {
// TODO Auto-generated method stub
return testDao.delete(sql, p);
}
}
spring配置文件
<!--扫描指定的包-->
<context:component-scan base-package="com.MrChegnse.jdbctest"></context:component-scan>
<!-- 配置数据源 -->
<bean name="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource" >
<property name="driverClassName" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://127.0.0.1:3306/tx" />
<property name="username" value="root" />
<property name="password" value="" />
</bean> <!-- 配置jdbc模块 -->
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="dataSource"></property>
</bean> <!-- 为数据源添加事物管理 -->
<bean id="dataSourceTransactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"></property>
</bean> <!-- 编写声明式事物 -->
<!-- transaction-manager:DataSourceTransactionManager类的实例化 -->
<tx:advice id="myAdvice" transaction-manager="dataSourceTransactionManager">
<tx:attributes>
<!-- * 表示任意的方法 -->
<tx:method name="*"/>
</tx:attributes>
</tx:advice> <!-- 编写AOP让spring自动对目标生成代理 -->
<aop:config>
<!-- 定义切点 -->
<aop:pointcut expression="execution(* com.MrChegnse.jdbctest.*.*())" id="point"/> <!-- 切面:将切入点与通知关联 -->
<aop:advisor advice-ref="myAdvice" pointcut-ref="point"/>
</aop:config>
测试
public ApplicationContext getapp(){
return new
ClassPathXmlApplicationContext("tx.xml");
}
public String test11(){
TestService testService = (TestService) getapp().getBean("testService");
String msg2 = "";
Object a [] = {2,"user2","pwd2"};
String sql = "insert into user values(?,?,?)";
try {
testService.save(sql, a);
} catch (Exception e) {
msg2 ="error";
e.printStackTrace();
}
return msg2;
}
@Test
public void test22(){
String a = test11();
System.out.println(a);
}
注:
1、<tx:advice>配置事务的通知
2、<tx:advice>一般需要指定id和transaction-manager属性,id是在配置文件中唯一标识,transaction-manager指定事务管理器
3、<tx:attributes>是<tx:advice>的子元素、执行执行事务的细节
4、<tx:advice>配置了事务增强处理后就可通过AOP配置让spring自动对目标生成代理
5、<aop:pointcut expression="execution(* com.MrChegnse.jdbctest.*.*())" id="point"/>
*:代表任意类型、任意类、任意方法
6、<aop:advisor advice-ref="myAdvice" pointcut-ref="point"/>:将切入点与通知关联
2)@Transactionl注解声明式事务管理
public interface TestDao {
public int save(String sql,Object p []);
public int delete(String sql,Object p []);
}
@Repository("TestDao")
public class TestDaoImpl implements TestDao{
@Autowired
private JdbcTemplate jdbcTemplate ; @Override
public int save(String sql, Object[] p) {
return jdbcTemplate.update(sql, p);
} @Override
public int delete(String sql, Object[] p) {
// TODO Auto-generated method stub
return jdbcTemplate.update(sql, p);
}
}
public interface TestService { public int save(String sql,Object p []);
public int delete(String sql,Object p []);
}
@Service("TestService")
@Transactional
public class TestServiceImpl implements TestService{
@Autowired
private TestDao testDao ; @Override
public int save(String sql, Object[] p) {
return testDao.save(sql, p);
} @Override
public int delete(String sql, Object[] p) {
// TODO Auto-generated method stub
return testDao.delete(sql, p);
}
}
spring的配置文件
<context:component-scan base-package="com.MrChegnse.jdbctest"></context:component-scan> <!-- 配置数据源 -->
<bean name="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource" >
<property name="driverClassName" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://127.0.0.1:3306/tx" />
<property name="username" value="root" />
<property name="password" value="" />
</bean> <!-- 配置jdbc模块 -->
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="dataSource"></property>
</bean> <!-- 为数据源添加事物管理 -->
<bean id="dataSourceTransactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"></property>
</bean> <!-- 为事务管理器注册注解驱动 -->
<tx:annotation-driven transaction-manager="dataSourceTransactionManager"/>
测试
public String test11(){
TestService testService = (TestService) getapp().getBean("testService");
String msg2 = ""; Object a [] = {,"user2","pwd2"};
String sql = "insert into user values(?,?,?)"; try {
testService.save(sql, a);
} catch (Exception e) { msg2 ="error";
e.printStackTrace();
}
return msg2;
} @Test
public void test22(){
String a = test11();
System.out.println(a);
}
注:
1、@Transactional:可以作用于接口、接口方法、类以及类的方法
2、当作用于类上时,该类的所有public方法都将具有该类型的事务属性,同时也可以在方法级别使用该注解来覆盖类级别的定义
3、Spring小组建议不要在接口或者方法上使用该注解,因为他只有在使用基于接口的代理时才会生效。
4、@Transactional(rollbackFor=RuntimeException.class):不对RuntimeException回滚生效
5、@Transactional(rollbackFor=Exception.class):不对Exception回滚生效
6、<tx:annotation-driven />:为事务管理器注册注解驱动驱动器
7、 @Transactional
public class TestServiceImpl implements TestService{
加上注解就可以指定这个类需要接受Spring的事务管理
只能针对public属性范围内的方法添加
基本完结..........
9.spring:事务管理(下):声明式事务管理的更多相关文章
- 全面分析 Spring 的编程式事务管理及声明式事务管理
开始之前 关于本教程 本教程将深入讲解 Spring 简单而强大的事务管理功能,包括编程式事务和声明式事务.通过对本教程的学习,您将能够理解 Spring 事务管理的本质,并灵活运用之. 先决条件 本 ...
- spring事物配置,声明式事务管理和基于@Transactional注解的使用
http://blog.csdn.net/bao19901210/article/details/41724355 http://www.cnblogs.com/leiOOlei/p/3725911. ...
- 全面分析 Spring 的编程式事务管理及声明式事务管理--转
开始之前 关于本教程 本教程将深入讲解 Spring 简单而强大的事务管理功能,包括编程式事务和声明式事务.通过对本教程的学习,您将能够理解 Spring 事务管理的本质,并灵活运用之. 先决条件 本 ...
- Spring编程式事务管理及声明式事务管理
本文将深入讲解 Spring 简单而强大的事务管理功能,包括编程式事务和声明式事务.通过对本教程的学习,您将能够理解 Spring 事务管理的本质,并灵活运用之. Spring 事务属性分析 事务管理 ...
- spring boot中的声明式事务管理及编程式事务管理
这几天在做一个功能,具体的情况是这样的: 项目中原有的几个功能模块中有数据上报的功能,现在需要在这几个功能模块的上报之后生成一条消息记录,然后入库,在写个接口供前台来拉取消息记录. 看到这个需求,首先 ...
- spring事务配置,声明式事务管理和基于@Transactional注解的使用(转载)
原文地址:http://blog.csdn.net/bao19901210/article/details/41724355 事务管理对于企业应用来说是至关重要的,好使出现异常情况,它也可以保证数据的 ...
- spring学习笔记(22)声明式事务配置,readOnly无效写无异常
在上一节内容中.我们使用了编程式方法来配置事务,这种优点是我们对每一个方法的控制性非常强.比方我须要用到什么事务,在什么位置假设出现异常须要回滚等.能够进行非常细粒度的配置.但在实际开发中.我们可能并 ...
- 八、Spring之深入理解声明式事务
Spring之深入理解声明式事务 何为事务? 事务就是把一系列的动作当成一个独立的工作单元,这些动作要么全部完成,要么全部不起作用. 事务的四个属性: 1.原子性(atomicity) 事务是原子性操 ...
- spring学习08(声明式事务)
11.声明式事务 11.1 回顾事务 事务在项目开发过程非常重要,涉及到数据的一致性的问题,不容马虎! 事务管理是企业级应用程序开发中必备技术,用来确保数据的完整性和一致性. 事务就是把一系列的动作当 ...
- spring基于xml的声明式事务控制配置步骤
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.sp ...
随机推荐
- 自动生成数据库字典(sql2008) 转自 飘渺の云海
每次做项目的时候都要做数据字典,这种重复的工作实在很是痛苦,于是广找资料,终于完成了自动生成数据库字典的工作,废话少说,上代码. 截取一部分图片: 存储过程: SET ANSI_NULLS ON GO ...
- JavaScript使用Object.defineProperty方法实现双数据绑定
Object.defineProperty这个方法非常值得学习,很多mvc框架中的双向数据绑定就是通过它来实现的. 本着互联网分享精神,今天我就将我自己的见解分享给大家,希望能有所帮助. 开始使用 O ...
- 微信小程序准备阶段。(一)
--知识储备--HTML+JS+CSS (一)下载一个微信web开发工具(后续代码都会写在这里边)附上链接:https://mp.weixin.qq.com/debug/wxadoc/dev/devt ...
- access 2010
access 2010(表4.1---4.5) 数据表视图创建表:创建----改ID一行的内容(字段----格式----数据类型----格式----字段大小)----完成. 设计视图创建表:创建--- ...
- json数据发送时浏览器提示“保存”解决
数据以json形式发送的时候,部分浏览器不能直接解析,而是提示是否保存,nodejs的express应用中可以通过如下代码解决该问题: router.get('/', function (req, r ...
- java 2018面试题-多线程汇总(含解答)
学习,内容越多.越杂的知识,越需要进行深刻的总结,这样才能记忆深刻,将知识变成自己的.这篇文章主要是对多线程的问题进行总结的,因此罗列了自己整理的多线程的问题,都是自己觉得比较经典和一些大企业面试会问 ...
- Java集合 之List(ArrayList、LinkedList、Vector、Stack)理解(new)
一. ArrayList底层实现原理 对比 和Vector不同,ArrayList中的操作不是线程安全的!所以,建议在单线程中才使用ArrayList,而在多线程中可以选择Vector或者CopyOn ...
- php FastCGI 进程意外退出 错误解决方法
服务器windows2008,php5.5 / php5.6,需要安装VC++运行库. 到Microsoft网站下载“Microsoft Visual C++ 2012 Redistributable ...
- 洛谷P3960 列队(动态开节点线段树)
题意 题目链接 Sol 看不懂splay..,看不懂树状数组... 只会暴力动态开节点线段树 观察之后不难发现,我们对于行和列需要支持的操作都是相同的:找到第\(k\)大的元素并删除,在末尾插入一个元 ...
- CSS3,transform3D立体可拖拽正方体实现原理
---恢复内容开始--- 今天咱们来说一下,CSS中的3D效果 .如果你把transform真的掌握的和纯熟的话,就可以直接通过CSS做出很多很炫酷的效果,甚至.轮播图和选项卡都可以通过CSS来做,咱 ...