博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Spring事务解析1-使用介绍
阅读量:4705 次
发布时间:2019-06-10

本文共 2231 字,大约阅读时间需要 7 分钟。

spring的事务控制让我们从复杂的事务处理中得到解脱,是我们再也不需要去处理获得连接,关闭连接,事务提交和回滚等操作,再也不需要在事务相关的方法中处理大量的try..catch...finally代码。

看下Spring中的事务控制的配置:

  
  

MyBatis自动参与到Spring的事务管理中,无需额外配置,只要org.mybatis.spring.SqlSessionFactoryBean引用的数据源与DataSourceTransactionManager引用的数据源一致即可,否则事务管理会不起作用。同时不要忘记配置Spring-tx的命名空间。

上述方法是一种事务控制,但是比较麻烦,它需要你在需要做事务控制的实现类上加上,@Transaction注解。还有一种配置方式,是关于Springmvc-Mybatis自动扫描的。

  
  
    
    
    
  
  
  

这种方式比较流行,因为他不需要加自动扫描注解的@transaction注解。只需要配置Spring文件,然后可以针对各个方法进行只读或者更改数据库配置。

ps:后面讨论的内容,是以第一种方法的源码为基础的。因为第一种是Spring事务控制的基础,第二种是在第一种的基础上操作的。

此处有一点需要注意:默认情况下Spring中的事务处理只对RuntimeExcpetion方法进行回滚

事务自定义标签

对于Spring中事务功能的代码,配置文件中有这样一个配置:<tx:annotation-driven/>。这个是事务的开关,如果没有此处配置,Spring中不存在事务功能。

使用关键字“annotation-driven”搜索全局代码,我们锁定 了TxNamespaceHandler中的init方法:

public class TxNamespaceHandler extends NamespaceHandlerSupport {    static final String TRANSACTION_MANAGER_ATTRIBUTE = "transaction-manager";    static final String DEFAULT_TRANSACTION_MANAGER_BEAN_NAME = "transactionManager";    static String getTransactionManagerName(Element element) {        return (element.hasAttribute(TRANSACTION_MANAGER_ATTRIBUTE) ?                element.getAttribute(TRANSACTION_MANAGER_ATTRIBUTE) : DEFAULT_TRANSACTION_MANAGER_BEAN_NAME);    }    @Override    public void init() {        registerBeanDefinitionParser("advice", new TxAdviceBeanDefinitionParser());        registerBeanDefinitionParser("annotation-driven", new AnnotationDrivenBeanDefinitionParser());        registerBeanDefinitionParser("jta-transaction-manager", new JtaTransactionManagerBeanDefinitionParser());    }}

这里解析了spring事务控制的三种配置方式。从以上代码可以知道,在遇到<tx:annotation-driven>为开头的配置时,Spring就是使用AnnotationDrivenBeanDefinitionParse类进行解析。

比如有一个方法为saveHerName()方法。

加上事务控制后变成了这样(Spring的事务都是以AOP的方式实现的):

con.setAutoCommit(false);  try{         saveHerName()         con.commit();  } catch(RunTimeExcpetion e){         con.rollback();  }

 

转载于:https://www.cnblogs.com/wade-luffy/p/6080123.html

你可能感兴趣的文章
简易版cnlog
查看>>
erlang程序运行的几种方式
查看>>
堆heap和栈Stack(百科)
查看>>
html5页面实现点击复制功能
查看>>
633. 寻找重复的数
查看>>
沉淀,再出发:python中的pandas包
查看>>
Rule 12: Remove Duplicate Scripts(Chapter 12 of High performance Web Sites)
查看>>
缓存服务的更新策略有哪些?
查看>>
RMAN还原时注意set newname时文件名不要有空格
查看>>
一种链表的实现
查看>>
vue中ESlint报错
查看>>
NetCore2.0 RozarPage自动生成增删改查
查看>>
0816 1459 json & pickle ,目录导入,目录规范
查看>>
Servlet 生命周期
查看>>
HDU 1398
查看>>
(转)Linux-HA实战(1)— Heartbeat安装
查看>>
如何恢复oracle中已删除的表
查看>>
双向BFS(转)
查看>>
【最短路】Dijkstra+ 链式前向星+ 堆优化(优先队列)
查看>>
linux下实现keepalived+nginx高可用
查看>>