【Java】连接Mysql实现回滚
程序员文章站
2024-01-26 15:30:28
...
前言
暑期项目实习第三课,用java写个连接Mysql实现回滚小程序。
建立简易的MySQl数据库
注意将id点上自动递增!
Tip:数据库建立内容详见第二课 【JAVA】连接Mysql的简单登陆注册实例.
任意添加点数据,用于后面实现功能。
Code
连接数据库等方法详见第二课 【JAVA】连接Mysql的简单登陆注册实例.
import java.sql.*;
import java.util.Scanner;
public class jdbc_test {
public static void main(String[] args) throws ClassNotFoundException, SQLException { //输入psvm 或者 main后回车
Connection conn = null;
PreparedStatement pstmt1 = null;
PreparedStatement pstmt2 = null;
try {
//获取连接
conn = JDBCUtils.getCounection();
//开启事务
conn.setAutoCommit(false);
//定义sql
String sql1 = "update account set balance = balance - ? where id = ?"; //sql语句
String sql2 = "update account set balance = balance + ? where id = ?";
//获取执行sql对象
pstmt1 = conn.prepareStatement(sql1);
pstmt2 = conn.prepareStatement(sql2);
pstmt1.setDouble(1,500);
pstmt1.setInt(2,1);
pstmt2.setDouble(1,500);
pstmt2.setInt(2,2);
//执行sql
pstmt1.executeUpdate();
//手动制造一个异常
// int i = 3/0;
pstmt2.executeUpdate();
//提交事务
conn.commit();
}catch (Exception e){
//事务回滚
try{
if(conn != null){
conn.rollback(); //事务回滚
}
}catch (SQLException e1){
e1.printStackTrace();
}
e.printStackTrace();
}finally {
JDBCUtils.close(pstmt1,conn);
JDBCUtils.close(pstmt2,conn);
}
}
}
最终实现
未出现异常时效果
当注释掉抛出异常的语句时我们可以发现数据库数据发生了修改。
// int i = 3/0; //抛出异常的语句,3/0是不允许的。
运行前.
运行后.
出现异常时效果
未注释掉抛出异常的语句时我们可以发现数据库数据未发生修改。
int i = 3/0; //抛出异常的语句,3/0是不允许的。
运行前.
运行后.
并且java内部抛出异常.
总结
如果未对操作进行回滚操作时就可能发生在sql1语句完成后未执行sql2语句,导致严重的数据异常,后期维护系统将会付出巨大的代价!
在数据表中呈现的效果便会是小张已经失去¥500,而小王并未获得¥500。
//定义sql
String sql1 = "update account set balance = balance - ? where id = ?"; //sql语句
String sql2 = "update account set balance = balance + ? where id = ?";
//获取执行sql对象
pstmt1 = conn.prepareStatement(sql1);
pstmt2 = conn.prepareStatement(sql2);
pstmt1.setDouble(1,500);
pstmt1.setInt(2,1);
pstmt2.setDouble(1,500);
pstmt2.setInt(2,2);
pstmt1.executeUpdate();
//手动制造一个异常
// int i = 3/0;
pstmt2.executeUpdate();
下一篇: THINKphp中复杂的查询