全局表
全局表说明
全局表配置使用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();
}
}
}