1、commit
对Sybase IQ数据库,在查询、更新、删除(含creat table, drop table等)等等操作的SQL语句前后(对dml的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 table 操作对同一个connection不生效,即lock后同一个connection的其他dml操作照样可以做;
(3)另外,对不同的connection,一个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";
}