美文网首页
Mycat1.6事务问题

Mycat1.6事务问题

作者: 七星石 | 来源:发表于2019-11-25 15:15 被阅读0次

    使用Mycat用于读写分离时,对数据库的事务不跨库,如果硬要打开事务没有关闭的话,容易产生系统事务紊乱等问题。通过源代码仔细分析,发现mycat并非透传sql语句。

   start transaction的处理

public final class StartHandler {

    private static final byte[] AC_OFF = new byte[] { 7, 0, 0, 1, 0, 0, 0, 0,

            0, 0, 0 };

    public static void handle(String stmt, ServerConnection c, int offset) {

        switch (ServerParseStart.parse(stmt, offset)) {

        case ServerParseStart.TRANSACTION:

            if (c.isAutocommit())

            {

                c.setAutocommit(false);

                c.write(c.writeToBuffer(AC_OFF, c.allocate()));

            }else

            {

                c.getSession2().commit() ;

            }

            break;

        default:

            c.execute(stmt, ServerParse.START);

        }

    }

}

也就是说,mycat把start transaction 改成了set commit=0,而且不是立即发送给后端mysql

2019-11-19T01:43:01.970695Z     5 Query SET autocommit=0;

2019-11-19T01:43:01.970695Z     5 Query update city set Name='MJMJ' where id=1

2019-11-19T01:43:06.907978Z     5 Query commit

2019-11-19T01:43:06.953980Z     5 Query rollback

2019-11-19T01:43:19.846718Z     5 Query SET autocommit=1;

2019-11-19T01:43:19.846718Z     5 Query select * from city where id = 1

前两条是一起送给mysql的。如果事务没有关闭,导致整个连接的autocommit属性的改变。

多了一个rollback

从上面一个简单的事务,可以发现每次commit后面都会跟着一个rollback

通过分析源代码NoBlockingSession.java发现

public void releaseConnection(RouteResultsetNode rrn, boolean debug, final boolean needRollback) {

BackendConnection c = target.remove(rrn);

if (c != null) {

if (debug) {

LOGGER.debug("release connection " + c);

}

if (c.getAttachment() != null) {

c.setAttachment(null);

}

if (!c.isClosedOrQuit()) {

if (c.isAutocommit()) {

c.release();

} //else if (needRollback) {

c.setResponseHandler(new RollbackReleaseHandler());

c.rollback();

} //else {

c.release();

}

}

}

}

needRollback的判断竟然被注释掉了,实在令人费解啊!

至此,mycat单node简单事务问题终于研究清楚了。

相关文章

  • Mycat1.6事务问题

    使用Mycat用于读写分离时,对数据库的事务不跨库,如果硬要打开事务没有关闭的话,容易产生系统事务紊乱等问题。...

  • MySQL基础-分库分表(一)

    零、本文纲要 一、分库分表 单数据库问题 拆分策略 实现技术 二、MyCat1.6入门 MyCat安装 MyCat...

  • Mycat 实现读写分离

    一、环境介绍 macOS(Mycat1.6) + centos(MySQL主从复制)实验拓扑 需求:已部署好 My...

  • 事务相关的问题总结

    一、事务回滚问题 二、事务失效问题 三、事务失效的解决办法 方式一:自己手动创建事务,提交事务,回滚事务(Spri...

  • ACID之I:事务隔离

    MyISAM 不支持事务, innoDB支持事务 多个事务可能存在问题 在多个事务共同操作时容易出现这样几个问题:...

  • mysql事务隔离机制及其隔离级别、实现原理分析

    目录 事务特性ACID属性 并发事务带来的问题 事务隔离级别 事务实现原理 事务特性ACID属性 事务特性指的就是...

  • mysql事务隔离机制及其原理

    目录 事务特性ACID属性 并发事务带来的问题 事务隔离级别 事务实现原理 闲聊 【迈莫coding】 事务特性A...

  • Spring事务问题

    问题:Spring中存在类A和类B,A中存在方法methodA。B中存在方法methodB1和methodB2。m...

  • spring事务问题

    springmvc中在service层中有如下逻辑:1.提交事务2.开启新线程,新线程中的业务依赖1中提交的事务处...

  • redis的事务控制

    redis的事务控制。 问个最简单的问题:redis有事务吗? 答:有。 再问个问题:redis事务能保证操作的原...

网友评论

      本文标题:Mycat1.6事务问题

      本文链接:https://www.haomeiwen.com/subject/ipfjwctx.html