mysql mycat 锁表_MyCat_全局表及其死锁问题

本文探讨了全局表在数据库设计中的应用,特别是在高并发场景下,如何通过type='global'确保数据一致性的同时,避免死锁问题。通过实例展示了并发更新z_dict表时遇到的死锁问题,并提供了使用场景建议和解决策略。
摘要由CSDN通过智能技术生成

全局表

全局表说明

全局表配置使用type='global'

全局表数据增加或者修改时,节点之间保持数据一致

全局表只适合修改不频繁的表,例如字典表

全局表死锁

为了保持数据的一致性,当全局表更新数据时会通过锁机制来保证数据统一。

当时这也导致了并发更新的时候死锁的发生,全局表需要慎用。

以下是测试代码:

z_dict表配置的为全局表

两个线程并发更新一条记录

基本上每次都会造成锁超时的问题

public static void testThreadUpdate(DataSourceFactory ds) throws SQLException {

Connection con1 = ds.getConnection();

Connection con2 = ds.getConnection();

UpdateThread thread1 = new UpdateThread(con1, "update z_dict set name=? where id=?", new ArrayList() {

private static final long serialVersionUID = 1L;

{

add("Q1");

add("1");

}

});

UpdateThread thread2 = new UpdateThread(con2, "update z_dict set name=? where id=?", new ArrayList() {

private static final long serialVersionUID = 1L;

{

add("Q2");

add("1");

}

});

thread1.start();

thread2.start();

try {

Thread.sleep(60000);

} catch (InterruptedException e) {

e.printStackTrace();

}

}

package com.am.mycatclient;

import java.sql.Connection;

import java.sql.PreparedStatement;

import java.sql.SQLException;

import java.util.List;

public class UpdateThread extends Thread {

private Connection con;

private List values;

private PreparedStatement ps;

public UpdateThread(Connection con, String updateSql, List values) {

super();

this.con = con;

this.values = values;

try {

con.setAutoCommit(false);

ps = con.prepareStatement(updateSql);

} catch (SQLException e) {

e.printStackTrace();

}

}

@Override

public void run() {

try {

for (int i = 1; i <= values.size(); i++) {

ps.setString(i, values.get(i - 1));

}

int executeUpdate = ps.executeUpdate();

System.out.println("=="+executeUpdate);

con.commit();

ps.close();

con.close();

} catch (Exception e) {

e.printStackTrace();

}

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值