对比实验:https://www.cnblogs.com/xiandedanteng/p/11955887.html
这次实验的环境是T440p上安装的Windows版Oracle11g,版本为:
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
用于实验造成行锁的程序:
package com.hy.multidelete; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; import java.sql.Statement; import org.apache.log4j.Logger; public class Deleter { private static Logger log = Logger.getLogger(Deleter.class); public void doDelete() { Connection conn = null; Statement stmt = null; try{ Class.forName(DBParam.Driver).newInstance(); conn = DriverManager.getConnection(DBParam.DbUrl, DBParam.User, DBParam.Pswd); conn.setAutoCommit(false); stmt = conn.createStatement(); String sql="delete from TestTB17 where id=1"; int deleted=stmt.executeUpdate(sql); // 在此处停住断点,另一个删除程序CleanExpiredMocker会执行不下去 log.info("Deleter deleted "+deleted+" records."); // 直到接下来回滚或提交CleanExpiredMocker才可以执行 conn.rollback(); log.info("Rollbacked."); } catch (Exception e) { System.out.print(e.getMessage()); } finally { try { stmt.close(); conn.close(); } catch (SQLException e) { System.out.print("Can't close stmt/conn because of " + e.getMessage()); } } } public static void main(String[] args) { Deleter d=new Deleter(); d.doDelete(); } }
设置了执行sql超时的程序:
package com.hy.multidelete; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; import java.sql.Statement; import org.apache.log4j.Logger; public class CleanExpiredMocker { private static Logger log = Logger.getLogger(CleanExpiredMocker.class); public void doClean() { Connection conn = null; Statement stmt = null; try{ Class.forName(DBParam.Driver).newInstance(); conn = DriverManager.getConnection(DBParam.DbUrl, DBParam.User, DBParam.Pswd); stmt = conn.createStatement(); stmt.setQueryTimeout(2); String sql="delete from TestTB17 where id<250"; int deleted=stmt.executeUpdate(sql); log.info("CleanExpiredMocker deleted "+deleted+" records.");; } catch (Exception e) { System.out.print(e.getMessage()); e.printStackTrace(); } finally { try { stmt.close(); conn.close(); } catch (SQLException e) { System.out.print("Can't close stmt/conn because of " + e.getMessage()); } } } public static void main(String[] args) { CleanExpiredMocker c=new CleanExpiredMocker(); c.doClean(); } }
执行后,很快就终止了执行,输出如下:
ORA-01013: 用户请求取消当前的操作 java.sql.SQLException: ORA-01013: 用户请求取消当前的操作 at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:439) at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:395) at oracle.jdbc.driver.T4C8Oall.processError(T4C8Oall.java:802) at oracle.jdbc.driver.T4CTTIfun.receive(T4CTTIfun.java:436) at oracle.jdbc.driver.T4CTTIfun.doRPC(T4CTTIfun.java:186) at oracle.jdbc.driver.T4C8Oall.doOALL(T4C8Oall.java:521) at oracle.jdbc.driver.T4CStatement.doOall8(T4CStatement.java:194) at oracle.jdbc.driver.T4CStatement.executeForRows(T4CStatement.java:1000) at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1307) at oracle.jdbc.driver.OracleStatement.executeUpdateInternal(OracleStatement.java:1814) at oracle.jdbc.driver.OracleStatement.executeUpdate(OracleStatement.java:1779) at oracle.jdbc.driver.OracleStatementWrapper.executeUpdate(OracleStatementWrapper.java:277) at com.hy.multidelete.CleanExpiredMocker.doClean(CleanExpiredMocker.java:24) at com.hy.multidelete.CleanExpiredMocker.main(CleanExpiredMocker.java:41)
程序,有时候真是跑起来才知道结果。
--END-- 2019年11月29日21:11:10