zoukankan      html  css  js  c++  java
  • MySql数据库事务正常提交,回滚失败

    • 问题:在初次练习Mysql数据库事务时,事务正常提交,但是在遇到异常应当回滚时,回滚失败。

    代码如下:

    //2.更新操作。
    public void update(Connection conn, String sql, Object ...objects){
            PreparedStatement preparedstatement = null;
            try {
                preparedstatement = conn.prepareStatement(sql);
                for(int i = 0; i < objects.length; i++){
                    preparedstatement.setObject(i + 1, objects[i]);
                }
                preparedstatement.executeUpdate();
            } catch (Exception e) {
                e.printStackTrace();
            }finally{
                TestTools.release(preparedstatement,null);
            }
        }
        /**
         * 2_1.测试以上方法
         */
        @Test
        public void test(){
            Connection conn = null;
            try {
                conn = TestTools.getConnection();
                //开始事务,在开始之前要关闭数据库默认自动提交
                conn.setAutoCommit(false);
    
                String sql = "update users set  balance = balance - 500 where id = 1";
                update(conn,sql);
                //出现异常时,事务回滚到之前的状态
                int number = 10 / 0;
                System.out.println(number);
    
                sql = "update users set  balance = balance + 500 where id = 2";
                update(conn,sql);
                //结束,就提交事务
                conn.commit();
    
            } catch (Exception e) {
                e.printStackTrace();
                //发生异常,事务回滚
                try {
                    conn.rollback();
                } catch (SQLException e1) {
                    e1.printStackTrace();
                }
            }finally{
                //设置事务提交方式为自动提交:
                try {
                    conn.setAutoCommit(true);
                } catch (SQLException e) {
                    e.printStackTrace();
                }
                //关闭连接
                TestTools.release(null, conn);
            }
        }
    结果应当是遇到异常事务回滚,但结果是id1balance的值被减去500,事务遇到异常没有回滚。
    • 原因:Mysql数据库引擎使用的是默认的MyISAM,mysql支持四种引擎,如下图
      这里写图片描述

    从图中可以看出mysql默认的引擎并不支持事务。

    • 解决方法:修改表引擎

    修改某个表的存储引擎为innodb:alter table table_name engine=innodb;
    注意:修改或者操作某个表之前首先要进入某个表所在的数据库中,使用use db_name go;,之后再进行增删改查操作。

    其他查看mysql引擎相关信息的sql语句:

    1.查看系统支持的存储引擎:show engines;
    2.查看表使用的存储引擎
    两种方法:
     a、show table status from db_name where name='table_name';
     b、show create table table_name;
    3.mysql当前默认的存储引擎:show variables like '%storage_engine%';
    4.某个表用了什么引擎:show create table 表名;
  • 相关阅读:
    TcpClient连接帮助类
    winform中添加管理员权限控制
    textbox中输入email做格式控制
    绑定和非绑定方法
    类的封装、property、多态和多态性
    继承类之点点滴滴
    爬虫日记-正则表达式
    爬虫日记-单元总结
    爬虫日记-最好大学排名实例
    爬虫日记-第一单元总结
  • 原文地址:https://www.cnblogs.com/tengpengfei/p/10454018.html
Copyright © 2011-2022 走看看