Sybase IQ并发DML的两个小技巧commit和lock table

来源:互联网 发布:javascript reduce 编辑:程序博客网 时间:2024/06/06 03:25

1、commit

对Sybase IQ数据库,在查询、更新、删除等等操作的SQL语句前后,都需要做commit操作,以防数据不一致。
commit;select count(*) from tableName;commit;

2、LOCK TABLE

Sybase IQ数据库,对同一表对象,是不能并发做DML操作的
解决方案为:在执行每一次DML操作的时候,通过执行语句“LOCK TABLE 表名 IN WRITE MODE WAIT ”锁表,让后来的DML操作排队。另外,也可以对锁表语句指定等待多长时间,语句为“LOCK TABLE表名IN WRITE MODE WAIT  hh:nn:ss:sss ”。
需要注意的是:
(1)在编码时警惕:锁表操作执行后,不可执行commit操作,否则锁表无效。正常做法是commit后lock table,再执行具体dml,最后commit;
(2)在编码时警惕:lock table 操作对同一个connection不生效,即lock后同一个connection的其他dml操作照样可以做;另外,对不同的connection,一个connection锁表后,必须要commit后或者该connection中断后,才能释放锁,其他connection才能进行dml操作。
public static void executeLockTableBeforeDml(Connection dbConn, String tableName, String operateFlag)  throws SQLException {        Statement ps = null;        try {            operateFlag += "(" + System.currentTimeMillis() + ")";            dbg.info("Prepare to lock table: " + tableName + " before " + operateFlag);            ps = dbConn.createStatement();            ps.execute(getLockTableSql(tableName));            dbg.info("Lock table success: " + tableName + " before " + operateFlag);        }        finally {            ConnectionWrapper.close(ps);        }    }    private static String getLockTableSql(String tableName) {        return "LOCK TABLE " + tableName + " IN WRITE MODE WAIT";    }


原创粉丝点击