笔记
事务:一个步骤包含多个操作,要么同时成功,要么同时失败。例子:银行转账,转账的人钱变少,另一个人的钱得变多,要么同时成功,要么同时失败。
开启事务:setAutoCommit(boolean autoCommit):调用该方法设置参数为false即为开启成功
提交事务:commit
回滚事务:rollback()
package com.zqyzc.com;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import com.zqyzc.util.JDBCUtils;
/**
* 事务操作
* @author 92086
*
*/
public class JDBCTest1 {
public static void main(String[] args) {
// 1获取链接
Connection conn = null;
PreparedStatement pstmt1 = null;
PreparedStatement pstmt2 = null;
try {
//1、获取链接
conn = JDBCUtils.getConnection();
//2、开启事务
conn.setAutoCommit(false);
//2、定义sql
//2.1 张三 +500
String sql1 = "update account set balance = balance + ? where id = ?";
//2.2李四 -500
String sql2 = "update account set balance = balance - ? where id = ?";
//3、获取执行sql对象
pstmt1 = conn.prepareStatement(sql1);
pstmt2 = conn.prepareStatement(sql2);
//4、设置参数
pstmt1.setDouble(1, 500);
pstmt1.setDouble(2, 1);
pstmt2.setDouble(1, 500);
pstmt2.setDouble(2, 2);
//5、执行sql
pstmt1.executeUpdate();
pstmt2.executeUpdate();
//当所以sql都执行完,提交事务
conn.commit();
} catch (Exception e) {
// TODO Auto-generated catch block
//事务的会滚操作
try {
if(conn!=null)
conn.rollback();
} catch (SQLException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
e.printStackTrace();
}finally{
JDBCUtils.close(pstmt1, conn);
JDBCUtils.close(pstmt2, null);
}
}
}
事务在获取链接后开启,在执行完所有的sql后关闭。当出现异常,无论什么异常,事务需要回滚
执行前:
执行后