我在Eclipse中使用了以下代码。运行代码后数据库没有更新。它仍然显示相同的值。我甚至在运行正常的数据库中运行sql查询但是一旦运行我的java代码什么都没有更新..
import java.io.*;
import java.sql.*;
import java.util.Properties;
public class ExpTran {
public static void main(String[] args) {
Connection con = null;
try {
FileInputStream io = new FileInputStream("config/db.properties");
Properties p = new Properties();
p.load(io);
Class.forName(p.getProperty("driver"));
con = DriverManager.getConnection(p.getProperty("url"),p);
Statement stmt = con.createStatement();
con.setAutoCommit(false);
int i = stmt.executeUpdate("update tutorials.account set amount=amount-500 where acc_no='A002'");
i += stmt.executeUpdate("update tutorials.account set amount=amount+500 where acc_no='A003'");
if(i!=2)
{
System.out.println("Exception");
throw new SQLException();
}
System.out.println(i);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
if(con!=null){
try {
con.rollback();
} catch (SQLException e1) {
e1.printStackTrace();
}
}
e.printStackTrace();
}
finally {
if(con!=null){
try {
con.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
}
答案 0 :(得分:2)
如果定义con.commit();
con.setAutoCommit(false);
的更改
同时避免使用单个try / catch / finally块进行多项操作。
public static void main(String[] args) {
Properties properties = new Properties();
try (FileInputStream propertiesInputStream = new FileInputStream("config/db.properties")) {
properties.load(propertiesInputStream);
} catch (IOException e) {
throw new RuntimeException("Error loading properties file.", e);
}
String driverClassName = properties.getProperty("driver");
try {
Class.forName(driverClassName);
} catch (ClassNotFoundException e) {
throw new RuntimeException("Error loading JDBC driver class.", e);
}
String databaseUrl = properties.getProperty("url");
try (Connection connection = DriverManager.getConnection(databaseUrl, properties)) {
connection.setAutoCommit(false);
Statement stmt = connection.createStatement();
executeUpdateAndCheck(stmt, "update tutorials.account set amount=amount-500 where acc_no='A002'");
executeUpdateAndCheck(stmt, "update tutorials.account set amount=amount+500 where acc_no='A003'");
connection.commit();
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
private static void executeUpdateAndCheck(Statement stmt, String command) throws SQLException {
int result = stmt.executeUpdate(command);
if (result == 0) {
stmt.getConnection().rollback();
throw new IllegalStateException();
}
}
答案 1 :(得分:2)
要么
conn.commit();
调用commit()会将所有更改写入数据库,因为自动提交已关闭,所以需要这些更改。如果发生异常,那么您需要捕获它并发出命令
conn.rollback();
将数据库恢复到原始状态。
否则,请执行
conn.setAutoCommit(true);
然后每个单独的语句将自动转换为数据库。麻烦在于每个语句都将在自己的事务中执行。如果在执行第一个语句后发生异常,则不会执行第二个语句,这可能会使DB处于不一致状态。
答案 2 :(得分:2)
尝试替换它:
con.setAutoCommit(false);
在此处:
System.out.println(i);
con.commit();
或将其设为true
:
con.setAutoCommit(true);
答案 3 :(得分:1)
插入或更新未在数据库中反映出来:con.setAutoCommit(false);
将此行替换为:
con.commit();
OR
con.setAutoCommit(true);
答案 4 :(得分:0)
您定义了con.setAutoCommit(false);
,因此您需要在完成操作时提交连接。
对于此用途Connection.commit()
:
if(i!=2) {
System.out.println("Exception");
throw new SQLException();
} else {
con.commit();
}