对比实验: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

最新文章

  1. HQL查询——from子句
  2. 第一个Struts2程序之HelloWorld
  3. Guava - EventBus(事件总线)
  4. MongoDB介绍及安装
  5. 那些证书相关的玩意儿(SSL,X.509,PEM,DER,CRT,CER,KEY,CSR,P12等)[zz]
  6. mapping 详解4(mapping setting)
  7. Nginx特点
  8. C++中避免内存泄露常见的解决方式
  9. c#Message多功能用法
  10. JavaScript获取客户端IP地址
  11. 团队作业8——第二次项目冲刺(Beta阶段)日志集合处
  12. linux_FTP连接失败
  13. CSAPP:第十二章 并发编程
  14. FiDDLER教程
  15. PHP进阶-网络编程基础概念
  16. Web API 跨域问题
  17. oracle 子查询和组合函数
  18. docker sshd image problem, session required pam_loginuid.so, cann&#39;t login
  19. 关键字的使用 pass break continue
  20. node.js发邮件

热门文章

  1. vmware虚拟机克隆后网卡修改
  2. 优化API接口响应速度
  3. mysql学习之基础篇02
  4. Vue+Express实现登录状态权限控制
  5. c#版本23个设计模式
  6. 云计算---记一次黑客攻击openstack创建的虚拟机
  7. RBF神经网络——直接看公式,本质上就是非线性变换后的线性变化(RBF神经网络的思想是将低维空间非线性不可分问题转换成高维空间线性可分问题)
  8. P1983 车站分级[拓扑]
  9. BZOJ3277 串 和 BZOJ3473 字符串
  10. php 常用字符串函数总结