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