spring--mybatis事务总结
spring--事务原理、mybatis--MapperScannerConfigurer 和 mybatis--MapperProxy事务,最近想把spring mybatis中的事务和mapper接口的原理分析分析,陆陆续续写了些,这篇做个总结。
spring+mybatis mapper接口 声明式事务配置
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"
lazy-init="false">
<property name="dataSource" ref="dataSource"/>
<property name="mapperLocations" value="classpath:sqlmapper/*Mapper.xml"/>
<property name="plugins">
<list>
<bean class="***">
<property name="dialect">
<bean class="***"/>
</property>
</bean>
</list>
</property>
</bean>
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="*.*.*" />
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory" />
</bean> <bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean> <tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="do*" read-only="false" rollback-for="java.lang.Exception"/>
<tx:method name="*" propagation="SUPPORTS" read-only="true"/>
</tx:attributes>
</tx:advice> <aop:config>
<aop:pointcut id="pc" expression="execution(* springtry.web.service.*.*(..))"/>
<aop:advisor pointcut-ref="pc" advice-ref="txAdvice"/>
</aop:config>
ps:以上在service层注入事务,do开头方法传播机制是required,其它的是supports
1. org.mybatis.spring.SqlSessionFactoryBean解析mapper xml配置,根据namespace添加class mapper组装Configuration对象,设置它的environment(包含springManagedTransactionFactory),最后getObject()包装出DefaultSqlSessionFactory;
2. org.mybatis.spring.mapper.MapperScannerConfigurer扫描basePackage下的mapper接口,每个接口封装为MapperFactoryBean(包含封装了DefaultSqlSessionFactory的SqlSessionTemplate),注册给spring容器。
ps:当调用"mapper接口"时去DefaultSqlSessionFactory-》Configuration获得接口类的代理类
MapperProxy mapperProxy = new MapperProxy(sqlSession, this.mapperInterface, this.methodCache);
3. 前面两步是系统的前提工作。
从service层方法开始,首先进入TransactionInerceptor事务拦截器,由 DataSourceTransactionManager 生成一个DataSourceTransactionObject事务对象,封装在DefaultTransactionStatus中,调用doBegin开启这个事务对象,设置这个事务对象 setConnectionHolder(new ConnectionHolder(Connection ex)),把这个ConnectionHolder 以键值对绑定在当前线程上 <this.getDataSource(),txObject.getConnectionHolder()>:
TransactionSynchronizationManager.bindResource(this.getDataSource(), txObject.getConnectionHolder());
返回这个 DefaultTransactionStatus对象,封装在TransactionAspectSupport.TransactionInfo中,绑定在当前线程上,之后调用实际service方法
4. service方法中会注入mybatis mapper接口,调用时实际调用
MapperFactoryBean-》SqlSessionTemplate-》DefaultSqlSessionFactory-》Configuration.getMapper(mapper接口, SqlSessionTemplate);
返回MapperProxy对mapper接口的代理,接着调用MapperProxy
5. MapperProxy中,根据调用的Method返回一个MapperMethod对象.execute(SqlSessionTemplate this.sqlSession, args),其中调用sqlSession.insert, sqlSession.update,sqlSession.delete,sqlSession.selectList,sqlSession.selectMap,sqlSession.selectOne等,
6. 接下来调用SqlSessionTemplate的方法,实际调用SqlSessionTemplate.sqlSessionProxy(SqlSessionTemplate.SqlSessionInterceptor拦截器拦截的代理),拦截器中使用 SqlSessionUtils 调用
SqlSessionTemplate.DefaultSqlSessionFactory.openSession-》Configuration-》environment-》springManagedTransactionFactory
生成一个SpringManagedTransaction事务对象,封装在一个Executor(SimpleExecutor/ReuseExecutor/BatchExecutor)中,封装在DefaultSqlSession中并返回。
封装在SqlSessionHolder中,并以键值对绑定在当前线程<DefaultSqlSessionFactory,SqlSessionHolder>
SqlSessionUtils 返回DefaultSqlSession
7. 调用DefaultSqlSession的(update/select等),其中
MappedStatement e = this.configuration.getMappedStatement(接口名.方法名 statement);
this.executor.query/update
8. 回到第6步生成的Executor,doupdate/doquery时会prepareStatement,其中会getConnection调用SpringManagedTransaction事务对象的getConnection(),
DataSourceUtils.getConnection(this.dataSource);
看 mybatis--MapperProxy事务 最后分析的
ConnectionHolder conHolder = (ConnectionHolder)TransactionSynchronizationManager.getResource(dataSource);
使用的是第三步当前线程的键值对,也就是service层开启spring事务的connection
其实,神秘的spring事务本质还是jdbc的connection,跟我们直接使用jdbc是一样的,但是做了增强
spring--mybatis事务总结的更多相关文章
- spring+mybatis事务管理
spring+mybatis事务管理 最近在和朋友做一个项目,考虑用springmvc+mybatis来做,之前在公司工作吧,对于数据库这块的配置也有人再弄,最近因为这个项目,我就上网学习了一些关于数 ...
- spring,mybatis事务管理配置与@Transactional注解使用[转]
spring,mybatis事务管理配置与@Transactional注解使用[转] spring,mybatis事务管理配置与@Transactional注解使用 概述事务管理对于企业应用来说是至关 ...
- spring,mybatis事务管理配置与@Transactional注解使用
spring,mybatis事务管理配置与@Transactional注解使用[转] spring,mybatis事务管理配置与@Transactional注解使用 概述事务管理对于企业应用来说是 ...
- spring+mybatis事务的readonly属性无效
在Spring配置事务中设置的read-only="true"不起作用,仍可以执行写操作:但是其他的正常.查看了一下DataSourceTransactionManager这个类的 ...
- spring,mybatis事务
概述事务管理对于企业应用来说是至关重要的,即使出现异常情况,它也可以保证数据的一致性.Spring Framework对事务管理提供了一致的抽象,其特点如下: 为不同的事务API提供一致的编程模型,比 ...
- spring+mybatis事务不起作用的原因
一.场景再现 @Override @Transactional public void updateById(String userId,String username) throws Excepti ...
- spring+mybatis事务配置(转载)
原文地址:http://blog.csdn.net/wgh1015398431/article/details/52861048 申明式事务配置步骤 .xml文件头部需要添加spring的相关支持: ...
- spring mybatis 事务配置及使用
转自:http://kinglixing.blog.51cto.com/3421535/723870
- 对于spring中事务@Transactional注解的理解
现在spring的配置都喜欢用注解,这边就说下@Transactional 一.如何开启@Transactional支持 要使用@Transactional,spring的配置文件applicatio ...
- springMVC+mybatis事务管理总结
1.spring,mybatis事务管理配置与@Transactional注解使用: 概述事务管理对于企业应用来说是至关重要的,即使出现异常情况,它也可以保证数据的一致性.Spring Framewo ...
随机推荐
- date之Hi时间的思考
工作中用到需要一个判断当前时间是否在 23:50到1:00之间的一段程序,在和别人的讨论中基本上有以下两种做法 1.分别获取时分进行判断和比较 <?php function check_time ...
- HTTP 错误 405.0 - Method Not Allowed
如果A页面通过表单(form)向B页面传递参数,而B页面是以“.htm or .html ”为扩展名的话,通过IIS解析会出现“HTTP 错误 405 -禁止访问资源”错误的提示. 原因:IIS解析文 ...
- 传参方式由url携带改为post提交
参考:http://www.cnblogs.com/logon/p/3218834.html 我们这里使用了iframe嵌套form表单POST提交,很简单,却能满足get|post等任何复杂情况的要 ...
- (剑指Offer)面试题31:连续子数组的最大和
题目: 输入一个整型数组,数组里有正数也有负数,数组中一个或连续多个整数组成一个子数组,求所有子数组的和的最大值.要求时间复杂度为O(n) 思路: 1.数组累加 从头到尾逐个累加数组中的每个数字,当累 ...
- 剖析SSH核心原理(一)
在我前面的文章中,也试图总结过SSH,见 http://blog.csdn.net/shan9liang/article/details/8803989 ,随着知识的积累,总感觉以前说得比较笼统, ...
- vim复制多行<转>
比如我要复制从第1行到第5行的数据,复制到第9行 光标移到第5行任意位置,输入ma光标移到第1行任意位置,输入y'a(这一定要打这个“'”单引号,否则就进入“INSERT”状态了光标移到需要复制的行, ...
- 【转】深入浅出REST
转自:http://www.infoq.com/cn/articles/rest-introduction 不知你是否意识到,围绕着什么才是实现异构的应用到应用通信的“正确”方式,一场争论正进行的如火 ...
- poj3250 Bad Hair Day
Description Some of Farmer John's N cows (1 ≤ N ≤ 80,000) are having a bad hair day! Since each cow ...
- 试读《JavaScript语言精髓与编程实践》
有幸看到iteye的活动,有幸读到<JavaScript语言精髓与编程实践_第2版>的试读版本,希望更有幸能完整的读到此书. 说来读这本书的冲动,来得很诡异,写一篇读后感,赢一本书,其实奖 ...
- Oracle DB 使用调度程序自动执行任务
• 使用调度程序来简化管理任务 • 创建作业.程序和调度 • 监视作业执行 • 使用基于时间或基于事件的调度来执行调度程序作业 • 描述窗口.窗口组.作业类和使用者组的用途 • 使用电子邮件通知 • ...