Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 无法从jdbc获取oracle表的独占锁_Java_Oracle_Jsp_Jdbc - Fatal编程技术网

Java 无法从jdbc获取oracle表的独占锁

Java 无法从jdbc获取oracle表的独占锁,java,oracle,jsp,jdbc,Java,Oracle,Jsp,Jdbc,我正在用jsp编写一个简单的代码来删除表中的一些数据 当我运行此语句时 lock table tbl_Booking, tbl_Ticket in exclusive mode 在oracle控制台中,它可以正常工作 现在,当我在java代码中使用它时,我无法获得锁 代码如下: String req = request.getParameter("T_NO"); if (con != null){ String sql = "lock table tbl_Booking

我正在用jsp编写一个简单的代码来删除表中的一些数据

当我运行此语句时

lock table tbl_Booking, tbl_Ticket in exclusive mode
在oracle控制台中,它可以正常工作

现在,当我在java代码中使用它时,我无法获得锁

代码如下:

String req = request.getParameter("T_NO");
    if (con != null){
        String sql = "lock table tbl_Booking, tbl_Ticket in exclusive mode";
        String sql1 = "DELETE FROM tbl_Ticket WHERE T_NO=?";
        String sql2 = "DELETE FROM tbl_Booking WHERE T_NO IN ?";
        Statement stmt = con.createStatement();
        PreparedStatement ps1 = con.prepareStatement(sql1);
        PreparedStatement ps2 = con.prepareStatement(sql2);
        ps1.setString(1, req);
        ps2.setString(1, req);
        if (stmt.execute(sql)){
            if ((ps1.executeUpdate() == 1)&&(ps2.executeUpdate() == 1)){
                response.setContentType("text");
                response.setCharacterEncoding("UTF-8");
                response.getWriter().write("Your ticket has been cancelled!");
            }
            else{
                response.setContentType("text");
                response.setCharacterEncoding("UTF-8");
                response.getWriter().write("Couldn't Cancel your ticket!");
            }
        }
        else{
            response.setContentType("text");
            response.setCharacterEncoding("UTF-8");
            response.getWriter().write("Couldn't get lock!");
        }
    }
每次我得到

没办法把门锁上

作为输出

固定代码:

<%@page import="java.sql.Statement"%>
<%@page contentType="java" pageEncoding="UTF-8"%>
<%@page import="java.sql.ResultSet"%>
<%@page import="java.sql.PreparedStatement"%>
<%@include file="oracle_connection.jsp"%>

<%    String req = request.getParameter("T_NO");
    if (con != null) {
        try {
            String sql = "lock table tbl_Booking, tbl_Ticket in exclusive mode";
            String sql1 = "DELETE FROM tbl_Ticket WHERE TICKET_NO=?";
            String sql2 = "DELETE FROM tbl_Booking WHERE TICKET_NO=?";
            Statement stmt = con.createStatement();
            PreparedStatement ps1 = con.prepareStatement(sql1);
            PreparedStatement ps2 = con.prepareStatement(sql2);
            ps1.setString(1, req);
            ps2.setString(1, req);
            stmt.execute(sql);
            if (ps1.executeUpdate() == 1) {
                ps2.executeUpdate();
                response.setContentType("text");
                response.setCharacterEncoding("UTF-8");
                response.getWriter().write("Your ticket has been cancelled!");
            } else {
                response.setContentType("text");
                response.setCharacterEncoding("UTF-8");
                response.getWriter().write("Couldn't Cancel your ticket!");
            }

        } catch (Exception e) {
            response.setContentType("text");
            response.setCharacterEncoding("UTF-8");
            response.getWriter().write(e.toString());
        }
    }
%>

尝试将其包装在Try-catch块中

仅仅因为它返回false并不意味着它失败了

try
    {
        stmt.execute(sql);
            if ((ps1.executeUpdate() == 1)&&(ps2.executeUpdate() == 1)){
                response.setContentType("text");
                response.setCharacterEncoding("UTF-8");
                response.getWriter().write("Your ticket has been cancelled!");
            }
            else{
                response.setContentType("text");
                response.setCharacterEncoding("UTF-8");
                response.getWriter().write("Couldn't Cancel your ticket!");
            }
    }
    catch (Exception e)
    {
        response.setContentType("text");
        response.setCharacterEncoding("UTF-8");
        response.getWriter().write(e.getMessage());
    }

没错
execute
-s文档说:“如果第一个结果是ResultSet对象,则返回:
true
false
如果是更新计数或没有结果”。@FMC的回答是正确的--
stmt.execute
如果没有返回结果集,则返回false。但是,为什么您希望在两个不同的表上获得独占锁,而只是根据看起来像是键的内容删除少数行?除非你的目标是建立一个系统,如果有多个用户试图使用它,它会很快陷入困境,否则这是没有意义的。我在Oracle工作了很多年,从未遇到过需要手动获取表锁的情况。我是在指令下实现锁的。这不是一个全面的事情,只是为了学习的目的。也有人告诉我们,我们在这里所做的是不实际的,在现实生活中没有任何意义。