我正在使用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 获取连接
有人知道吗?
最佳答案
您是否在两个应用程序服务器中使用相同的事务隔离级别?如果您不确定,可以通过调用 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 中事务隔离级别的附加信息,
关于java - 更新时executeBatch()锁定表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37494475/