Sybase IQ并发DML的两个小技巧提交commit和锁表lock table

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";
    }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值