tommyle 2019-03-29 10:57 采纳率: 0%
浏览 827

mycat后面连接postgresql数据库,采用xa事务,事务不一致问题,如何解决

1.PG安装的两套,分别在两个主机上;
2.mycat将employee表,分成10片,每5片对应一个数据库(由于没有环境安装10个pg数据库)。配置文件如下:

table name="employee" primaryKey="eid" dataNode="dn1,dn2,dn3,dn4,dn5,dn6,dn7,dn8,dn9,dn10" rule="auto-sharding-long" /dataNode name="dn1" dataHost="indexdb1" database="idx"
dataNode name="dn2" dataHost="indexdb2" database="idx"
......
dataNode name="dn9" dataHost="indexdb1" database="idx"
dataNode name="dn10" dataHost="indexdb2" database="idx"

3、通过java应用插入数据。pg数据库也进行了xa相关设置
  for(int i=1;i<=500;i++){
            try {
                con = DriverManager.getConnection(
                        ");

                con.setAutoCommit(false);
                con.prepareStatement("set xa=on").execute();

                sql = "insert into employee(eid,name,level) values("+i+",'txb2','2')";
                rt = con.prepareStatement(sql).execute();
                System.out.println(i);
                sql = "insert into employee(eid,name,level) values("+ (i + 10000) + ",'tommy','2')";
                //rt = stmt.execute(sql);                                              tommy
                rt = con.prepareStatement(sql).execute();                              tommy
                sql = "insert into employee(eid,name,level) values("+ (i + 20000) + ",'tommy','2')";
                rt = con.prepareStatement(sql).execute();                              tommy
                sql = "insert into employee(eid,name,level) values("+ (i + 30000) + ",'tommy','2')";
                rt = con.prepareStatement(sql).execute();                              tommy
                sql = "insert into employee(eid,name,level) values("+ (i + 40000) + ",'tommy','2')";
                rt = con.prepareStatement(sql).execute();                              tommy
                sql = "insert into employee(eid,name,level) values("+ (i + 50000) + ",'tommy','2')";
                rt = con.prepareStatement(sql).execute();                              tommy
                sql = "insert into employee(eid,name,level) values("+ (i + 60000) + ",'tommy','2')";
                rt = con.prepareStatement(sql).execute();                              tommy
                sql = "insert into employee(eid,name,level) values("+ (i + 70000) + ",'tommy','2')";
                rt = con.prepareStatement(sql).execute();                              tommy
                sql = "insert into employee(eid,name,level) values("+ (i + 80000) + ",'tommy','2')";
                rt = con.prepareStatement(sql).execute();                              tommy
                sql = "insert into employee(eid,name,level) values("+ (i + 90000) + ",'tommy','2')";
                rt = con.prepareStatement(sql).execute();
                con.commit();
                con.close();
                System.out.println(rt); 
            } catch (Exception e) {

                System.out.println(e);
                System.out.println(rt);
                try {
                    con.rollback();
                } catch (SQLException e1) {
                    // TODO 自动生成的 catch 块
                    e1.printStackTrace();
                }

4.插入数据过程中,将其中1台pg数据库,通过命令关闭,或者kill -9 杀掉。反复操作。无论哪种情况,期望结果应该是,两台数据库数据条数相同,且为5的倍数。实际测试结果,条数不等,且也不为5的倍数。即同一个事务中,部分执行完成,当数据库连接断开后,并没有完全回滚。同样的数据库分成2片的时候,未测出该问题。 烦请大神帮助解决,多谢!

  • 写回答

1条回答 默认 最新

  • 憧憬blog 2023-03-15 08:13
    关注

    针对这个问题,可能存在多个原因导致事务不一致,具体可以从以下几个方面入手:

    1.是否存在并发问题,即多个事务同时执行相同的操作导致数据冲突;

    2.是否存在网络连接问题,即连接断开或者超时导致事务无法正常提交或回滚;

    3.是否存在XA事务配置不正确的问题,例如没有正确配置XA事务管理器或者没有正确实现XA事务协议;

    4.是否存在mycat和PG数据库之间的数据同步问题,即mycat缓存中的数据与PG数据库中的数据不一致导致事务不一致。

    针对这些问题,可以采取以下几个措施:

    1.采用锁机制或者乐观锁机制等手段解决并发问题,确保每个事务是串行执行的;

    2.在数据库连接时设置合理的超时时间并增加连接池数量,避免网络连接问题;

    3.仔细查看XA事务相关的配置信息,并确保所有的配置都正确;

    4.定期检查mycat和PG数据库之间的数据同步情况,并采取相应的措施确保数据一致。

    评论

报告相同问题?

悬赏问题

  • ¥15 素材场景中光线烘焙后灯光失效
  • ¥15 请教一下各位,为什么我这个没有实现模拟点击
  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置
  • ¥15 有没有研究水声通信方面的帮我改俩matlab代码
  • ¥15 ubuntu子系统密码忘记
  • ¥15 保护模式-系统加载-段寄存器