一个转账的例子:把A账户中的钱转到B中去,要分为两步:第1步 把钱从A账户中取出来
第2步 把钱存到A账户中去
这里对应两条update语句,一条对应A账户上的钱,一条对应B账户上的钱, 这两条update语句要么同时执行成功,要么同时不执行成功 , 不允许存在中间状态(一条语句执行成功,一条语句没执行成功) 那么,这两条update语句构成一个transaction,
DML语句在执行过程中,他会自动提交,默认conn.setAutoCommit(true)。
要想把语句放在transaction里面,要做的第一件事是 conn.setAutoCommit(false)
一例子:
import java.sql.*;
public class TestTransaction {
public static void main(String[] args) {
Connection conn = null;
Statement stmt = null;
try {
Class.forName("oracle.jdbc.driver.OracleDriver");
conn = DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:SXT", "scott", "tiger");
conn.setAutoCommit(false);
stmt = conn.createStatement();
stmt.addBatch("insert into dept2 values (51, '500', 'haha')");
stmt.addBatch("insert into dept2 values (52, '500', 'haha')");
stmt.addBatch("insert into dept2 values (53, '500', 'haha')");
stmt.executeBatch();
conn.commit();
conn.setAutoCommit(true);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch(SQLException e) {
e.printStackTrace();
try {
if(conn != null)
{
conn.rollback();
conn.setAutoCommit(true);
}
} catch (SQLException e1) {
e1.printStackTrace();
}
}finally {
try {
if(stmt != null)
stmt.close();
if(conn != null)
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}