当前位置:   article > 正文

JDBC连接MySQL数据库操作时事务回滚不起作用_mysql 服务端插入数据事务回滚不生效

mysql 服务端插入数据事务回滚不生效

一、问题

示例数据库表:
在这里插入图片描述
示例代码:

public static void main(String[] args) {

        Connection conn=null;
        PreparedStatement ps=null;

        try {

            Class.forName("com.mysql.cj.jdbc.Driver");
            conn= DriverManager.getConnection("jdbc:mysql://localhost:3306/student?serverTimezone=GMT%2B8", user, password);

            //开始事务
            conn.setAutoCommit(false);

            String sql="update test set name=? where id=?";
            ps=conn.prepareStatement(sql);
            ps.setString(1, "lisi");
            ps.setInt(2,1001);
            int count=ps.executeUpdate();
            
            String nothing=null;
            nothing.toString();
            
            ps.setString(1, "zhangsan");
            ps.setInt(2, 1002);
            count+=ps.executeUpdate();
            System.out.println(count==2?"成功":"失败");

            //提交事务
            conn.commit();
        }catch (Exception e){

            if (conn!=null){
                try {
                    conn.rollback(); //回滚事务
                } catch (SQLException e1) {
                    e1.printStackTrace();
                }
            }

            e.printStackTrace();
        }finally {

            if(ps!=null){
                try {
                    ps.close();
                }catch (Exception e){
                    e.printStackTrace();
                }
            }

            if (conn!=null){
                try {
                    conn.close();
                }catch (Exception e){
                    e.printStackTrace();
                }
            }
        }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58

正常情况下,当程序抛出异常后,应当执行事务回滚操作,不执行程序中的sql语句改变id=1001的名字,可是程序运行后,数据表中id=1001的名字仍然发生了改变。
在这里插入图片描述

二、原因

数据表数据仍改变,说明事务并未回滚,在程序无错误的前提下,那么问题则可能出在数据表本身,想到存储引擎的特点,InnoDB存储引擎支持事务,但MyISAM和MEMORY存储引擎不支持事务,于是通过指令show variables like '%storage_engine%';查看当前数据表的存储引擎。
在这里插入图片描述
可以看到default_storage_engine(永久表的默认存储引擎)是MyISAM,于是找到问题所在。
(default_tmp_storage_engine是临时表的默认存储引)

三、解决

从网上找到的修改mysql数据库默认存储引擎的方法:

修改my.cnf,在配置文件里面将参数default-storage-engine=MyISAM修改为default-storage-engine=InnoDB,然后重启数据库服务。
在这里插入图片描述
但是,已经创建的表的存储引擎仍然为MyISAM。
在这里插入图片描述
还需要通过ALTER TABLE 表名 ENGINE = InnoDB;来修改已创建的表的存储引擎。在这里插入图片描述在这里插入图片描述
修改完成后重新运行程序问题解决。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/秋刀鱼在做梦/article/detail/992177
推荐阅读
相关标签
  

闽ICP备14008679号