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 ...
随机推荐
- Magento开发文档(一):Magento入门
开始之前,首先声明下,Magento开发者手册由Alan Storm发表在Magento官方网站上.总共分八个部分,由浅入深的介绍了Magento的MVC架构及Magento中使用的比较特殊的EAV模 ...
- Android导入自定义的jar包时出现 E/AndroidRuntime(486): java.lang.NoClassDefFoundError错误
把自定义的jar包放在Android的工程的libs目录下,运行程序,会出现一下错误: 10-10 08:34:06.479: E/dalvikvm(486): Could not find clas ...
- 如何加入自定义WebControl
http://www.screencast.com/users/Dennis.Garavsky/folders/Default/media/c75b4ec6-1641-4f82-936e-39360d ...
- Linux 批量添加用户
#!/bin/bashfor i in $(seq 1 50) #会建立1-50的用户douseradd student$i -g studentecho student$i |passwd ...
- Extjs Google的Suggest的自动提示 从后台取数据
//服务器取数据 var remoteStore = Ext.create('Ext.data.Store', { proxy: ({ type: "ajax", url:&quo ...
- win7和linux下的文件共享
在vmware虚拟机下安装linux系统,如果自个电脑的win7设置成自动获取IP的话,每次使用FTP文件传输服务器都要检查win7和linux系统的IP是否处于同一网段,如果不是还要手动设置.再有一 ...
- 关于form.submit()不能提交表单的错误原因
来源:http://www.ido321.com/948.html 直接上代码把: 1: <div id="register"> 2: <h4>会员注冊&l ...
- 【M25】将构造方法和非成员方法虚化
1.所谓虚化,就是根据引用或者指针的真实类型,决定调用哪个方法. 2.构造方法虚化,就是根据引用(或者指针)的真实类型,构造出一个对象,如果指针的真实类型是Base,返回Base*:如果指针的真实类型 ...
- uoj #118. 【UR #8】赴京赶考 水题
#118. [UR #8]赴京赶考 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://uoj.ac/problem/118 Description ...
- hihocoder #1177 : 顺子 模拟
#1177 : 顺子 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://hihocoder.com/problemset/problem/1177 ...