Java 带有用户输入的JDBC事务
我知道打开一个事务,等待用户输入,然后继续进行一个事务是一种非常糟糕的编程方式。然而,这是我正在做的一项课程作业所必需的——我们不允许更改已经给我们的表格 我使用的是一个数据库访问类,它有一个runQuery和update方法。为了使用事务,我创建了一个名为commit transaction的新方法-Java 带有用户输入的JDBC事务,java,postgresql,jdbc,transactions,Java,Postgresql,Jdbc,Transactions,我知道打开一个事务,等待用户输入,然后继续进行一个事务是一种非常糟糕的编程方式。然而,这是我正在做的一项课程作业所必需的——我们不允许更改已经给我们的表格 我使用的是一个数据库访问类,它有一个runQuery和update方法。为了使用事务,我创建了一个名为commit transaction的新方法- public static void commitTransaction(String SQLStatement) throws SQLException, Exc
public static void commitTransaction(String SQLStatement) throws SQLException,
Exception {
Connection dbConnect = DatabaseAccess.getConnection();
PreparedStatement p = null;
try {
dbConnect.setAutoCommit(false);
p = dbConnect.prepareStatement(SQLStatement);
} catch (Exception e) {
System.out.println("An error has occured");
}
p.executeUpdate();
//dbConnect.setAutoCommit(true);
dbConnect.close();
}
由于dbConnect.setAutoCommit(false),我创建了一个单独的函数,我认为这是允许用户在事务期间输入所必需的。我试图创建的方法进行了安全预订——启动事务,等待一系列输入,然后提交事务。我没有从java中得到错误-但是没有向数据库添加任何内容
我认为我的事务可能没有提交的一个原因是我在用户输入中运行查询。我需要输出这些查询的结果集-因此我没有使用禁用自动提交的commitTransaction方法。这可能是怎么回事吗?如果是这样,我该如何解决
//Start the transaction
DatabaseAccess.commitTransaction("START TRANSACTION;");
bookingID = BookingErrorChecks.createBookingID();
/////////////////////////////////////////////
//User inputs for flight they wish to book
/////////////////////////////////////////////
System.out.println("Showing available seats on your flight:");
SQLStatement = "SELECT Flight.flightID, flightDate,\n"
+ "(MaxCapacity - SUM(NumSeats))\n"
+ "AS AvailableSeats FROM Flight JOIN\n"
+ " FlightBooking ON Flight.flightID =\n"
+ " FlightBooking.flightID\n"
+ "WHERE (Status = 'R' OR Status = 'H') AND Flight.flightID="
+ flightID
+ "GROUP BY Flight.flightID";
answer = DatabaseAccess.runQuery(SQLStatement);
/////////////////////////////////////////////
//Prints out table of results
/////////////////////////////////////////////
if (Integer.parseInt(availableSeats) < 1)
{
System.out.println("There are no available seats, choose another"
+ "flight");
DatabaseAccess.commitTransaction("ROLLBACK");
} else {
save = DatabaseAccess.setSavepoint();
}
/////////////////////////////////////////////
//User input for the number of seats and their first and last name
/////////////////////////////////////////////
SQLStatement = "SELECT customerID FROM LeadCustomer WHERE FirstName = '"
+ firstName + "' AND Surname = '" + lastName + "'";
answer = DatabaseAccess.runQuery(SQLStatement);
if (answer.next()) {
customerID = answer.getInt("CustomerID");
} else {
/////////////////////////////////////////////
//Create customer
/////////////////////////////////////////////
}
/////////////////////////////////////////////
//Final user inputs about the flight
/////////////////////////////////////////////
SQLStatement = "INSERT INTO FlightBooking values("
+ bookingID + "," + customerID + "," + flightID + ","
+ numSeats + ",'" + status + "','" + time + "',"
+ totalCost+")";
DatabaseAccess.commitTransaction(SQLStatement);
DatabaseAccess.commitTransaction("COMMIT TRANSACTION;");
System.out.println("Flight Booking was sucessfully added.");
}
}
//启动事务
DatabaseAccess.commitTransaction(“启动事务;”);
bookingID=BookingErrorChecks.createBookingID();
/////////////////////////////////////////////
//用户输入他们希望预订的航班
/////////////////////////////////////////////
System.out.println(“显示航班上的可用座位:”);
SQLStatement=“选择Flight.flightID,flightDate,\n”
+“(最大容量-总和(numsets))\n”
+“作为航班加入中的可用测试\n”
+“FlightBooking ON Flight.flightID=\n”
+“FlightBooking.flightID\n”
+“其中(状态='R'或状态='H')和Flight.flightID=”
+飞虫
+“按航班分组。flightID”;
answer=DatabaseAccess.runQuery(SQLStatement);
/////////////////////////////////////////////
//打印出结果表
/////////////////////////////////////////////
if(Integer.parseInt(AvailableSets)<1)
{
System.out.println(“没有可用的座位,请选择其他座位”
+“飞行”);
DatabaseAccess.commitTransaction(“回滚”);
}否则{
save=DatabaseAccess.setSavepoint();
}
/////////////////////////////////////////////
//用户输入座位数及其名字和姓氏
/////////////////////////////////////////////
SQLStatement=“从LeadCustomer中选择customerID,其中FirstName=”
+姓氏=“+lastName+”;
answer=DatabaseAccess.runQuery(SQLStatement);
if(answer.next()){
customerID=answer.getInt(“customerID”);
}否则{
/////////////////////////////////////////////
//创建客户
/////////////////////////////////////////////
}
/////////////////////////////////////////////
//关于航班的最终用户输入
/////////////////////////////////////////////
SQLStatement=“插入FlightBooking值(”
+bookingID+”、“+customerID+”、“+flightID+”、”
+numSeats+”、“+status+”、“+time+”、”
+总成本+”;
DatabaseAccess.commitTransaction(SQLStatement);
DatabaseAccess.commitTransaction(“提交事务;”);
System.out.println(“已成功添加航班预订”);
}
}
dbConnect.setAutoCommit之后的(false)
您需要调用dbConnect.commit()
或更改自动提交模式,如dbConnect.setAutoCommit(true)代码>如何执行此操作?如果我用相同的方法将auto commit设置为true,那么首先肯定会取消auto commit的使用?我刚刚尝试创建一个新方法publicstaticvoidsavetransaction()抛出SQLException,Exception
{Connection dbConnect=DatabaseAccess.getConnection();`try{dbConnect.setAutoCommit(true);}catch(Exception e){System.out.println(“发生错误”);}但是当我调用它时,仍然没有任何提交您必须使用第一次将自动提交设置为false的同一个连接对象。如果你得到一个新的连接,那么显然它将无法工作。您还可以尝试直接在同一对象上调用commit(),而不是更改自动提交模式。请参阅setAutoCommit()的javadoc。