executeBatch()在更新时锁定表

时间:2016-05-28 01:56:07

标签: java prepared-statement websphere-7

我正在使用preparedStatement和executebatch执行更新,如下所示:

query = "UPDATE BP_PROCESO SET " +
                "FILTROS = FILTROS||?, " +
                "COD_ETAPA_RECHAZO= ?," +
                "APROBADO=? " +
                "WHERE " +
                "NIU=? AND " +
                "COD_CAMPANIA = ?";
        ps = con.prepareStatement(query);


Iterator it = registros.entrySet().iterator();

while(it.hasNext()){

         int contador = 1;
            ps.setObject(contador++, cadenaFiltro);
            ps.setObject(contador++, etapaRechazo);
            ps.setObject(contador++, 0);
            ps.setObject(contador++, pojo.getNiu());
            ps.setObject(contador++, codigoCampania);
            ps.addBatch();
            if(respuesta %500==0){
                System.out.println(respuesta);
                ps.executeBatch();
                System.out.println("executed");
                ps.clearBatch();
            }
 }

第一次当ps.executeBatch()表被锁定时,我在Apache Tomcat中调试并且它没有被锁定,应用程序安装在Websphere 7.0.0.17中,我通过JNDI获取连接< / p>

有没有人有任何想法?

1 个答案:

答案 0 :(得分:1)

您是否在两个应用程序服务器中使用相同的事务隔离级别?如果您不确定,可以通过调用con.getTransactionIsolation()并比较值来进行检查。大多数JDBC驱动程序的默认值为java.sql.Connection.TRANSACTION_READ_COMMITTED(2),而WebSphere Application Server对大多数数据库使用默认值java.sql.Connection.TRANSACTION_REPEATABLE_READ(4)。事务隔离级别会影响数据库中的锁定,TRANSACTION_REPEATABLE_READ通常涉及比TRANSACTION_READ_COMMITTED更严格的锁定。例如,要以编程方式更改事务隔离级别,您可以在获得连接后执行con.setTransactionIsolation(java.sql.Connection.TRANSACTION_READ_COMMITED)。请注意,您还可以通过webSphereDefaultIsolationLevel数据源定制属性覆盖数据源级别的默认事务隔离级别。您还可以在资源引用扩展上为您用于获取数据源的资源引用配置事务隔离级别。

以下技术说明包含有关WebSphere Application Server中的事务隔离级别的其他信息,

http://www-01.ibm.com/support/docview.wss?uid=nas8N1012999