JDBC控制事务:
在日常生活中我们能看见各式各样的数据更改,如:转账,但如果由于操作异常,导致转账失败,钱会不会损失呢?
今天就让我们了解一下JDBC的事务管理的机制!
1.事务:一个包含多个步骤的业务操作。如果这个业务操作被事务管理,则这多个步骤要么同时成功,要么同时失败。
2.操作:
- 开启事务
- 提交事务
- 回滚事务
3.使用Connection对象来管理事务
- 开启事务:
- 调用该方法,设置参数为 false,即开启事务。
setAutoCommit(boolean autoCommit) - 创建连接后,在执行SQL前开启事务
- 调用该方法,设置参数为 false,即开启事务。
// 开启事务
conn.setAutoCommit(false);
- 提交事务:commit()
- 当所有SQL执行完后提交事务
// 提交事务
conn.commit();
- 回滚事务:rollback()
- 在catch中回滚事务
try {
if(conn!= null){
// 事务回滚
conn.rollback();
}
} catch (SQLException ex) {
ex.printStackTrace();
}
业务说明:
- 张三和李四的账户各有1000
- 张三(zhangsan)给李四(lisi)转账500
- 在出现异常时,未添加事务和添加事务得到的结果。
执行效果:
// 执行SQL
i = pstmt1.executeUpdate();
int count = 1/0;
accept = pstmt2.executeUpdate();
- 控制台信息:
- 账户异常:
说明:这里出现了一个by zero的算术异常,导致转账业务中,收账方(lisi)更改数据失败。
添加事务操作后:
- 用户账户
- 控制台信息
说明:添加事务操作以后,即便出现了by zero的算术异常,但是有了回滚机制,用户账户的数据不会出现异常,保障了账户的安全。
正常转账的效果
-
当前账户
-
转账成功后
-
控制台信息
-
账户信息
-
import util.JDBCUtils;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
/**
* @author: seh
* @date: 2020/10/3 9:19
* @version: 1.0
*/
/*
* JDBC 事务管理 完成转账 业务
*
* */
public class JDBCDemo6 {
public static void main(String[] args) {
Connection conn = null;
PreparedStatement pstmt1 = null;
PreparedStatement pstmt2 = null;
int i = 0;
int accept = 0;
try {
// 1.获取数据库连接
conn = JDBCUtils.getConnection();
// 开启事务
conn.setAutoCommit(false);
// 2.定义SQL语句
String sql1 = "update account set money = money - ? where id = ? ";
String sql2= "update account set money = money + ? where id = ? ";
// 3.获取SQL的对象
pstmt1 = conn.prepareStatement(sql1);
pstmt2= conn.prepareStatement(sql2);
// 4.给 ? 赋值
pstmt1.setInt(1,500);
pstmt1.setInt(2,1);
pstmt2.setInt(1,500);
pstmt2.setInt(2,2);
// 执行SQL
i = pstmt1.executeUpdate();
// int count = 1/0;
accept = pstmt2.executeUpdate();
// 提交事务
conn.commit();
} catch (Exception e) {
try {
if(conn!= null){
// 事务回滚
conn.rollback();
}
} catch (SQLException ex) {
ex.printStackTrace();
}
e.printStackTrace();
}finally {
// 处理结果
if(i>0 && accept >0){
System.out.println("转账成功!");
}else {
System.out.println("转账失败!");
}
JDBCUtils.close(pstmt1,conn);
JDBCUtils.close(pstmt2,null);
}
}
}
public static void close(PreparedStatement pstmt, Connection conn){
if(pstmt!=null){
try {
pstmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (conn != null) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
url=jdbc:mysql:///db2
user=root
pwd=123456
driver=com.mysql.jdbc.Driver