基本介绍
JDBC
程序中当一个 Connection
对象创建时,默认情况下是自动提交事务:每次执行一个 SQL
语句时,如果执行成功,就会向数据库自动提交,而不能回滚JDBC
程序中为了让多个 SQL
语句作为一个整体执行,需要使用事务- 调用
Connection
的 setAutoCommit(false)
可以取消自动提交事务 - 在所有的
SQL
语句都成功执行后,调用 Connection
的 commit();
方法提交事务 - 在其中某个操作失败或出现异常时,调用
Connection
的 rollback();
方法回滚事务
转账案例
package Test;
import org.junit.Test;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
public class Test13 {
@Test
public void noTransaction(){
Connection conn = null;
String sql1 = "update account set money = money - 1000 where id = 100";
String sql2 = "update account set money = money + 1000 where id = 200";
PreparedStatement ps = null;
try{
conn = JDBCUtils.getConnection();
ps = conn.prepareStatement(sql1);
ps.executeUpdate();
int i = 1 / 0;
ps = conn.prepareStatement(sql2);
ps.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
} finally {
JDBCUtils.close(null, ps, conn);
}
}
@Test
public void useTransaction(){
Connection conn = null;
String sql1 = "update account set money = money - 1000 where id = 100";
String sql2 = "update account set money = money + 1000 where id = 200";
PreparedStatement ps = null;
try{
conn = JDBCUtils.getConnection();
conn.setAutoCommit(false);
ps = conn.prepareStatement(sql1);
ps.executeUpdate();
ps = conn.prepareStatement(sql2);
ps.executeUpdate();
conn.commit();
} catch (SQLException e) {
System.out.println("执行 SQL 语句时发生异常,撤销执行的 SQL 语句");
try {
conn.rollback();
} catch (SQLException ex) {
ex.printStackTrace();
}
e.printStackTrace();
} finally {
JDBCUtils.close(null, ps, conn);
}
}
}