搞懂spring事务
最近一个官网的项目,我在service层有两个添加数据的操作,很意外报错了,然后就研究到了事务
之前只是知道声明式事务和编程式事务,编程式的事务显得比较麻烦,一般都是使用声明式事务..
spring提供了很多种配置方式:
1 编程式事务:
开启事务;
try{
更新或添加操作;
提交;
}catch(..){
回滚;
}
2 声明式事务:
提交,回滚的操作写在了一个代理类里头,在执行事务方法之前开启事务,在执行完方法之前提交或者回滚事务
1 给每个bean(service类)配置一个代理类
2 所有service类公用一个代理类
3 拦截器(aop的方式)
4 全注解(在service类加上Transaction)
注 : spring只对runtiomException才会回滚(经测试的) 提供了对应的属性设置异常类型
下面是我项目里头事务的配置 (config配置呢) :
/**
* 注解声明式事务配置(相当于上述的aop方式的配置)
* @author liyong
*
*/
@Configuration
public class TxAdviceTransactionConfig {
private static final String AOP_POINTCUT_EXPRESSION = "execution(* com.mike.mihome.*.service..*.*(..))"; @Autowired
private PlatformTransactionManager transactionManager; @Bean
public TransactionInterceptor txAdvice(){
NameMatchTransactionAttributeSource source = new NameMatchTransactionAttributeSource(); //只读事务,不做更新操作
RuleBasedTransactionAttribute readOnlyTx = new RuleBasedTransactionAttribute();
readOnlyTx.setReadOnly(true);
readOnlyTx.setPropagationBehavior(TransactionDefinition.PROPAGATION_NOT_SUPPORTED); //当前存在事务就使用当前事务,当前不存在事务就创建一个新的事务
RuleBasedTransactionAttribute requiredTx = new RuleBasedTransactionAttribute();
// requiredTx.setRollbackRules(Collections.singletonList(new RollbackRuleAttribute(Exception.class))); //设置异常类型
requiredTx.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);
requiredTx.setTimeout(10000); Map<String, TransactionAttribute> txMap = new HashMap<String, TransactionAttribute>();
txMap.put("query*", readOnlyTx);
txMap.put("get*", readOnlyTx); txMap.put("*", requiredTx);
source.setNameMap(txMap); TransactionInterceptor txAdvice = new TransactionInterceptor(transactionManager, source);
return txAdvice;
} @Bean
public Advisor txAdviceAdvisor() {
AspectJExpressionPointcut pointcut = new AspectJExpressionPointcut();
pointcut.setExpression(AOP_POINTCUT_EXPRESSION);
return new DefaultPointcutAdvisor(pointcut, txAdvice());
}
}

注 : 我这个项目有点坑,最后才知道是我这数据库不支持事务的缘故,底层引擎是 MyISAM 的...
MyISAM引擎不支持事务
如果要支持事务的话,则考虑InnoDB或BDB存储引擎(日常中一般都是选InnoDB较多)。所以,并不是我的问题,但是了解到了很多问题.
1 spring 事务默认只对运行时异常回滚,非运行时异常是不会滚的哦,所以我的方法里头设置了Exception
2 aop配置方式也有两种: 一种是xml配置和注解的配置
搞懂spring事务的更多相关文章
- 这一次搞懂Spring事务注解的解析
前言 事务我们都知道是什么,而Spring事务就是在数据库之上利用AOP提供声明式事务和编程式事务帮助我们简化开发,解耦业务逻辑和系统逻辑.但是Spring事务原理是怎样?事务在方法间是如何传播的?为 ...
- 这一次搞懂Spring事务是如何传播的
文章目录 前言 正文 事务切面的调用过程 事务的传播性概念 实例分析 总结 前言 上一篇分析了事务注解的解析过程,本质上是将事务封装为切面加入到AOP的执行链中,因此会调用到MethodIncepto ...
- 什么。你还没有搞懂Spring事务增强器 ,一篇文章让你彻底搞懂Spring事务,虽然很长但是干货满满
上一篇文章主要讲解了事务的Advisor是如何注册进Spring容器的,也讲解了Spring是如何将有配置事务的类配置上事务的,也讲解了Advisor,pointcut验证流程:但是还未提到的那个Ad ...
- 一张图搞懂Spring bean的完整生命周期
一张图搞懂Spring bean的生命周期,从Spring容器启动到容器销毁bean的全过程,包括下面一系列的流程,了解这些流程对我们想在其中任何一个环节怎么操作bean的生成及修饰是非常有帮助的. ...
- 五分钟学Java:一篇文章搞懂spring和springMVC
原创声明 本文作者:黄小斜 转载请务必在文章开头注明出处和作者. 本文思维导图 什么是Spring,为什么你要学习spring? 你第一次接触spring框架是在什么时候?相信很多人和我一样,第一次了 ...
- 五分钟学Java:一篇文章带你搞懂spring全家桶套餐
原创声明 本文首发于微信公众号[程序员黄小斜] 本文作者:黄小斜 转载请务必在文章开头注明出处和作者. 本文思维导图 什么是Spring,为什么你要学习spring? 你第一次接触spring框架是在 ...
- 这一次搞懂Spring代理创建及AOP链式调用过程
文章目录 前言 正文 基本概念 代理对象的创建 小结 AOP链式调用 AOP扩展知识 一.自定义全局拦截器Interceptor 二.循环依赖三级缓存存在的必要性 三.如何在Bean创建之前提前创建代 ...
- 就这?一篇文章让你读懂 Spring 事务
什么是事务 ▲ 百度百科 概括来讲,事务是一个由有限操作集合组成的逻辑单元.事务操作包含两个目的,数据一致以及操作隔离.数据一致是指事务提交时保证事务内的所有操作都成功完成,并且更改永久生效:事务回滚 ...
- 一文搞定 Spring事务
Spring 事务 上文 使用SpringJDBC 1.JDBC事务控制 不管你现在使用的是那一种ORM开发框架,只要你的核心是JDBC,那么所有的事务处理都是围绕着JDBC开展的,而JDBC之中 ...
随机推荐
- 如何正确使用javah
bogon:src zexu$ javah -jni -classpath /Users/zexu/github/ijkplayer/android/ijkplayer/ijkplayer-java/ ...
- lesson - 1 - IP /DNS /cat !$ /putty 知识扩充
一.知识点扩充 1.嵌入式Linux 开发与运维 .安卓手机 . Linux真正的用武之地是蓬勃发展的信息接入设备市 场.这些新兴的设备只有有限的内存,价格也只有几百美元,因此开发者需要新的 ...
- windows 命令行打开浏览器
在命令行打开百度 start chrome www.baidu.com
- Spring Dynamic DataSource Routing
Use AbstractRoutingDataSource to dynamicly switch datasources, see http://spring.io/blog/2007/01/23/ ...
- 万能选项卡,tab选项卡
//万能选项卡 function PaPtabs(thisObj, num) { if (thisObj.className == "active") return; var ta ...
- Python第二十二天 stat模块 os.chmod方法 os.stat方法 pwd grp模块
Python第二十二天 stat模块 os.chmod方法 os.stat方法 pwd grp模块 stat模块描述了os.stat(filename)返回的文件属性列表中各值的意义,根据 ...
- JavaScript 之DOM&BOM
重点来了 : BOM对象 window对象 : 所有浏览器都支持window对象. 概念上讲 : 一个html文档对应一个window对象. 功能上讲 : 控制浏览器窗口的. 使用上讲 : windo ...
- Django学习日记07_Admin
django.contrib django.contrib是django中附带的一个工具集,由很多的附加组件组成.这些附加组件包括管理工具(django.contrib.admin).用户鉴别系统(d ...
- scala的Option
当一个函数既要返回对象,又要返回null的时候,使用Option[] http://www.runoob.com/scala/scala-options.html Option是scala的选项,用来 ...
- Celery(四)定时任务
要定时或者周期性的执行任务,可以使用linux的crontab.Celery也提供了类似的Periodic Tasks功能. Celery beat Celery使用celery beat作为任务调度 ...