spring、mybatis 声明式事务问题,求解答

哎呦-又忘了 发布于 2017/12/13 09:26
阅读 239
收藏 0

spring的 DataSourceTransactionManager 从当前线程中得到 ConnectionHolder 再从ConnectionHolder得到Connection,
从而控制事务 doGetTransaction() 、doCommit(DefaultTransactionStatus)这两个方法在其父类AbstractPlatformTransactionManager中会被调用。
之后AbstractPlatformTransactionManager会在TransactionAspectSupport.invokeWithinTransaction(Method, Class<?>, InvocationCallback) 中被调用。

那么问题来了: ConnectionHolder 在何时与当前线程绑定的?mybatis与spring整合时使用的SqlSessionFactory是
 org.mybatis.spring.SqlSessionFactoryBean 而不是 org.apache.ibatis.session.SqlSessionFactory 是在这里面做的么?
 

加载中
0
哎呦-又忘了
哎呦-又忘了

为嘛没有人?

0
湖水没了
湖水没了

开启事务前,先检查事务有没有ConnectionHolder,没有就创建一个,并把数据库连接放进去

    @Override
    protected void doBegin(Object transaction, TransactionDefinition definition) {
        DataSourceTransactionObject txObject = (DataSourceTransactionObject) transaction;
        Connection con = null;

        try {
            if (txObject.getConnectionHolder() == null ||
                    txObject.getConnectionHolder().isSynchronizedWithTransaction()) {
                Connection newCon = this.dataSource.getConnection();
                if (logger.isDebugEnabled()) {
                    logger.debug("Acquired Connection [" + newCon + "] for JDBC transaction");
                }
                txObject.setConnectionHolder(new ConnectionHolder(newCon), true);
            }
 

哎呦-又忘了
哎呦-又忘了
回复 @kerneler : 嗯,主要是没配置事务也能操作数据库,说明能得到连接,表明事务的控制不仅仅是在 DataSourceTransactionManager 中实现的 这条路我一直没理清楚
湖水没了
湖水没了
回复 @哎呦-又忘了 : 原来你发的也是这个类,就是你发的这个类里面的代码。。。
湖水没了
湖水没了
回复 @哎呦-又忘了 : DataSourceTransactionManager 我是看的这个类
哎呦-又忘了
哎呦-又忘了
这块源码 确实没找到 用的mybatis 能告知下么?
哎呦-又忘了
哎呦-又忘了
那 mapper 是在那里获取的 Connection的? 如果没有配事务,就不能获得 Connection了 这个是怎么处理?
0
我说芒果儿
我说芒果儿

你要不要再看一下 mybaits 的流程。。。。

OSCHINA
登录后可查看更多优质内容
返回顶部
顶部