用idea提交事务

用idea提交事务

要么都成功要么都失败

ACID原则:原子性 要么要么、一致性 总数不变、隔离性 多进程互不干扰、持久性 一旦提交不可逆

隔离性问题

提交事务练习

/*测试事务
成功则提交,失败则回滚
 */

import com.xy.MySQL.myMethods.JDBCUtils;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

public class TestTransaction1 {
    public static void main(String[] args) {
        Connection conn = null;
        PreparedStatement pst = null;
        ResultSet rs = null;

        try{
            //连接数据库
            conn = JDBCUtils.getConnection();//连接到jdbctest数据库

            //关闭数据库的自动提交功能,会自动开启事务
            conn.setAutoCommit(false);//因为会自动开启事务,所以不用像SQL语句那样再写开启事务语句

            //执行业务
            String sql1 = "UPDATE account SET money = money-100 WHERE name='A'";
            pst = conn.prepareStatement(sql1);
            pst.executeUpdate();

            String sql2 = "update account set money = money+100 where name='B'";
            pst = conn.prepareStatement(sql2);
            pst.executeUpdate();

            //业务完毕,提交事务
            conn.commit();
            System.out.println("转账成功");
            conn.setAutoCommit(true);//开启自动提交

        } catch (SQLException e){
            try{
                System.out.println("转账失败");
                conn.rollback();//如果失败则回滚业务
            }catch(SQLException e1){
                e1.printStackTrace();
            }
            e.printStackTrace();
        } finally {
            JDBCUtils.release(conn,pst,rs);
        }
    }
}

运行结果

如上图所示,事务提交成功


接下来再试验一下提交失败回滚

在两个sql之间加一条必定失败的语句,如 int i = 1/0;

/*测试事务
成功则提交,失败则回滚
 */

import com.xy.MySQL.myMethods.JDBCUtils;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

public class TestTransaction2 {
    public static void main(String[] args) {
        Connection conn = null;
        PreparedStatement st =null;
        ResultSet rs = null;

        try {
            conn = JDBCUtils.getConnection();

            conn.setAutoCommit(false);
            //关闭自动提交 也就是开启事务

            String sql1 = "update account set money=money-100 where name ='A'";
            st=conn.prepareStatement(sql1);
            st.executeUpdate(sql1);

            int i=1/0;  //万能报错

            String sql2 = "update account set money=money+100 where name ='B'";
            st=conn.prepareStatement(sql2);
            st.executeUpdate(sql2);

            //事务提交

            conn.commit();
            System.out.println("转账成功");
            conn.setAutoCommit(true);
        } catch (SQLException throwables) {
            //如果失败自动回滚
            try {
                System.out.println("转账失败");
                conn.rollback();
            } catch (SQLException e) {
                e.printStackTrace();
            }

            throwables.printStackTrace();
        }finally {
            JDBCUtils.release(conn,st,rs);
        }
    }
}

分析一下,很明显sql1会成功

因为中间插了个万能报错语句,很明显sql2是不会成功的

由事物的原子性分析,整个事务不会成功提交,捕捉异常,回滚

所以sql1和sql2都会失败,数据库表account数据回滚

运行结果

如上图所示,数据提交失败回滚,我们的分析是正确的


在使用idea提交事务的过程中,我遇到了一个很纠结的问题

idea总是报错:Lock wait timeout exceeded; try restarting transaction

即锁等待超时。让我头疼了好久

在机缘巧合下,我发现了报错的原因

代码一开始就是关闭自动提交conn.setAutoCommit(false);

可我在之前的学习过程中已经关闭了自动提交

于是我尝试着先打开自动提交再运行程序

竟然成功了

我仿佛知道为什么每次执行完事务以后都要重新开启自动提交了

我也不确定是不是这样的,反正我是成功了~~

posted @   无关风月7707  阅读(289)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
点击右上角即可分享
微信分享提示