Mysql事务操作失败如何解决

Mysql事务操作失败如何解决

事务的原子性 :事务是数据库的逻辑工作单位,事务中包含的各操作要么都做,要么都不做 。

要实现事务的原子性,单单靠一条commit或是rollback命令还是不行的,因为例如commit命令它只是将一个事务中执行成功的DML语句提交给数据库里。如果要实现事务的原子性,则就需要commit和rollback命令配合上程序上的一个业务逻辑才能可以,具体业务逻辑代码如下示例代码:

1.现象

程序中打开了事务进行插入,但是没有commit,表中的数据已经存在,就是回滚也不能删除插入的数据

2.原因

本表的Storage Engine 为myisam,不是innoDB,不支持事务处理 rollback()

3.解决方法

使用 alter table xxxx engine = innoDB ; 将表改为 InnoDB 引擎,结果回滚正常。

4.代码

 private void testCrud() {
     Connection conn = null;      //连接对象
     PreparedStatement pstmt = null;  //预编译的SQL语句对象
      try{
        //加载MySQL驱动程序
        Class.forName("com.mysql.jdbc.Driver");
        //连接字符串
        String url = "jdbc:mysql://localhost:3306/test";
        //建立数据库连接
        conn = DriverManager.getConnection(url,"root","");
        //设置事务的隔离级别
        // conn.setTransactionIsolation(Connection. TRANSACTION_REPEATABLE_READ);
        //设置自动提交为false,开始事务
        conn.setAutoCommit(false);
        //带参数的更新语句
        String sql = "INSERT INTO user_info (username ,password ,age )values(?,?,?)";
        //准备语句
        pstmt = conn.prepareStatement(sql);
        //绑定参数,执行更新语句,将张三的账户金额减去1000元
        pstmt.setString(1, "zhangui");
        pstmt.setString(2, "1111");
        pstmt.setInt(3, 300);
        pstmt.execute();

        //绑定参数,执行更新语句,将李四的账户金额增加1000元
        // pstmt.setString(1, "zzzzzzzzzzzzzzzzz"); //绑定了非法参数
        //pstmt.setString(2, "1111111111");
        //pstmt.setInt(3, 500);
        //pstmt.execute(); //将抛出SQL异常
        //提交事务
        //conn.commit();
        System.out.println("事务已提交,转账成功!");
        //关闭语句、连接
        pstmt.close(); conn.close();
      }catch(Exception e){
        try{
          conn.rollback();  //回滚事务
          System.out.println("事务回滚成功,没有任何记录被更新!");
        }catch(Exception re){
          System.out.println("回滚事务失败!");
        }
        e.printStackTrace();
      }finally{
        if(pstmt!=null) try{pstmt.close();}catch(Exception ignore){}
        if(conn!=null) try{conn.close();}catch(Exception ignore){}
      }

  }

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

(0)

相关推荐

  • 深入解析MySQL的事务隔离及其对性能产生的影响

    SQL标准定义了4类隔离级别,包括了一些具体规则,用来限定事务内外的哪些改变是可见的,哪些是不可见的.低级别的隔离级一般支持更高的并发处理,并拥有更低的系统开销. Read Uncommitted(读取未提交内容)        在该隔离级别,所有事务都可以看到其他未提交事务的执行结果.本隔离级别很少用于实际应用,因为它的性能也不比其他级别好多少.读取未提交的数据,也被称之为脏读(Dirty Read). Read Committed(读取提交内容)        这是大多数数据库系统的默认隔离

  • MySQL 四种事务隔离级别详解及对比

    MySQL 四种事务隔离级别详解及对比 按照SQL:1992 事务隔离级别,InnoDB默认是可重复读的(REPEATABLE READ).MySQL/InnoDB 提供SQL标准所描述的所有四个事务隔离级别.你可以在命令行用--transaction-isolation选项,或在选项文件里,为所有连接设置默认隔离级别. 例如,你可以在my.inf文件的[mysqld]节里类似如下设置该选项: transaction-isolation = {READ-UNCOMMITTED | READ-CO

  • MySQL中Innodb的事务隔离级别和锁的关系的讲解教程

    前言: 我们都知道事务的几种性质,数据库为了维护这些性质,尤其是一致性和隔离性,一般使用加锁这种方式.同时数据库又是个高并发的应用,同一时间会有大量的并发访问,如果加锁过度,会极大的降低并发处理能力.所以对于加锁的处理,可以说就是数据库对于事务处理的精髓所在.这里通过分析MySQL中InnoDB引擎的加锁机制,来抛砖引玉,让读者更好的理解,在事务处理中数据库到底做了什么. 一次封锁or两段锁? 因为有大量的并发访问,为了预防死锁,一般应用中推荐使用一次封锁法,就是在方法的开始阶段,已经预先知道会

  • NodeJs使用Mysql模块实现事务处理实例

    依赖模块: 1. mysql:https://github.com/felixge/node-mysql npm install mysql --save 2. async:https://github.com/caolan/async npm install async --save (ps: async模块可换成其它Promise模块如bluebird.q等) 因为Node.js的mysql模块本身对于事务的封装过于简单,而且直接使用会有很严重callback hell,故我们封装了两个方法

  • PHP入门教程之使用Mysqli操作数据库的方法(连接,查询,事务回滚等)

    本文实例讲述了PHP入门教程之使用Mysqli操作数据库的方法.分享给大家供大家参考,具体如下: Demo1.php <?php //使用 mysqli 对象操作数据库 //创建 mysqli 对象(资源句柄) $_mysqli = new mysqli(); //连接数据库 1.主机名(ip) 2.账户 3.密码 4.数据库 //mysqli_connect 函数 == $_mysqli -> connect(); $_mysqli -> connect('localhost','ro

  • 深入理解MySQL中的事务机制

    使用数据库事务可以确保除事务性单元内的所有操作都成功完成.MySQL中的InnoDB引擎的表才支持transaction.在一个事务里,如果出现一个数据库操作失败了,事务内的所有操作将被回滚,数据库将会回到事务前的初始状态.有一些不能被回滚的语句:将在本文的最后讨论. 在一个web应用中,会很经常遇到需要使用事务的地方,要么希望若干语句都执行成功,要么都不执行,如果出现有些执行成功,而其他的失败将会导致数据损坏. 在这篇文章的例子中,我们使用下面的两张表"employee"和"

  • 简单介绍MySQL中的事务机制

    从一个问题开始 最近银行这个事情闹的比较厉害啊,很多储户的钱放在银行,就不翼而飞了,而银行还不管不问,说是用户的责任,打官司,用户还能输了,这就是"社会主义".咱还是少发牢骚,多种树,莫谈国事. 说到银行存钱,就不得不说一下从银行取钱这件事情,从ATM机取钱这件简单的事情,实际上主要分为以下几个步骤: 登陆ATM机,输入密码: 连接数据库,验证密码: 验证成功,获得用户信息,比如存款余额等: 用户输入需要取款的金额,按下确认键: 从后台数据库中减掉用户账户上的对应金额: ATM吐出钱:

  • Mysql事务操作失败如何解决

    Mysql事务操作失败如何解决 事务的原子性 :事务是数据库的逻辑工作单位,事务中包含的各操作要么都做,要么都不做 . 要实现事务的原子性,单单靠一条commit或是rollback命令还是不行的,因为例如commit命令它只是将一个事务中执行成功的DML语句提交给数据库里.如果要实现事务的原子性,则就需要commit和rollback命令配合上程序上的一个业务逻辑才能可以,具体业务逻辑代码如下示例代码: 1.现象 程序中打开了事务进行插入,但是没有commit,表中的数据已经存在,就是回滚也不

  • mysql5.7.18安装时mysql服务启动失败的解决方法

    MySQL 是一个非常强大的关系型数据库.但有些初学者在安装配置的时候,遇到种种的困难,在此就不说安装过程了,说一下配置过程.在官网下载的mysql时候,有msi格式和zip格式.Msi直接运行安装即可,zip则解压在自己喜欢的目录地址即可.在安装这两种的时候,都需要配置才能用.以下介绍主要是msi格式默认的地址:C:\Program Files\ mysql-5.7.18-win32. 一.在安装或者解压后,需要配置环境变量,过程如下:我的电脑->属性->高级系统设置->高级->

  • 详解VMware开启模块diskearly的操作失败的解决

    VMWare (Virtual Machine ware)是一个"虚拟PC"软件公司.它的产品可以使你在一台机器上同时运行二个或更多Windows.DOS.LINUX系统.当我们想在一台机器上运行N个系统时需要用到.同时,VMWare支持拷贝后在其它机器上直接打开运行的. 但是有时候会遇到这个问题"VMware 锁定文件失败 开启模块 diskearly 的操作失败 未能启动虚拟机",那下面就教下如何解决这个问题. 工具/原料 VMware虚拟机 方法/步骤 1.首

  • mysql事务管理操作详解

    本文实例讲述了mysql事务管理操作.分享给大家供大家参考,具体如下: 本文内容: 什么是事务管理 事务管理操作 回滚点 默认的事务管理 首发日期:2018-04-18 什么是事务管理: 可以把一系列要执行的操作称为事务,而事务管理就是管理这些操作要么完全执行,要么完全不执行(很经典的一个例子是:A要给B转钱,首先A的钱减少了,但是突然的数据库断电了,导致无法给B加钱,然后由于丢失数据,B不承认收到A的钱:在这里事务就是确保加钱和减钱两个都完全执行或完全不执行,如果加钱失败,那么不会发生减钱).

  • MYSQL锁表问题的解决方法

    本文实例讲述了MYSQL锁表问题的解决方法.分享给大家供大家参考,具体如下: 很多时候!一不小心就锁表!这里讲解决锁表终极方法! 案例一 mysql>show processlist; 参看sql语句 一般少的话 mysql>kill thread_id; 就可以解决了 kill掉第一个锁表的进程, 依然没有改善. 既然不改善, 咱们就想办法将所有锁表的进程kill掉吧, 简单的脚本如下. #!/bin/bash mysql - u root - e " show processli

  • Thinkphp事务操作实例(推荐)

    实例如下: //开启mysql事务操作 $model = M(); $model->startTrans(); $flag=false; $deal1 = M('ppdd')->where(array('id'=>$data_P['id'],'zt'=>'0'))->save($data_arr); $deal2 = M('tgbz')->where(array('id'=>$ppddxx['p_id']))->save(array('is_dakuan'=

  • MySQL 事务概念与用法深入详解

    本文实例讲述了MySQL 事务概念与用法.分享给大家供大家参考,具体如下: 事务的概念 MySQL事务是一个或者多个的数据库操作,要么全部执行成功,要么全部失败回滚. 事务是通过事务日志来实现的,事务日志包括:redo log和undo log. 事务的状态 活动的(active) 事务对应的数据库操作正在执行过程中时,我们就说该事务处在活动的状态. 部分提交的(partially committed) 当事务中的最后一个操作执行完成,但由于操作都在内存中执行,所造成的影响并没有刷新到磁盘时,我

  • 一文了解MySQL事务隔离级别

    目录 前言 1.四种事务隔离级别 1.1 READ UNCOMMITTED 1.2 READ COMMITTED 1.3 REPEATABLE READ 1.4 SERIALIZABLE 1.5 小结 2.并发事务中的问题 2.1 脏读 2.2 不可重复读 2.3 幻读 3.隔离级别实战 3.1 查询事务隔离级别 3.2 设置事务隔离级别 3.3 脏读问题 3.4 不可重复读问题 3.5 幻读问题 总结 前言 MySQL 事务隔离级别是为了解决并发事务互相干扰的问题的,MySQL 事务隔离级别总

  • mysql show操作简单示例

    本文实例讲述了mysql show操作.分享给大家供大家参考,具体如下: SHOW CHARACTER SET 显示所有可用的字符集 SHOW CHARACTER SET; SHOW CHARACTER SET LIKE 'latin%'; SHOW COLLATION 输出包括所有可用的字符集 SHOW COLLATION; SHOW COLLATION LIKE 'latin1%'; SHOW COLUMNS 显示在一个给定表中的各列的信息,对于视图,本语句也起作用. SHOW COLUMN

  • PHP操作MySQL事务实例

    本文实例讲述了PHP操作MySQL事务的方法,分享给大家供大家参考.具体方法如下: 一般来说,事务都应该具备ACID特征.所谓ACID是Atomic(原子性),Consistent(一致性),Isolated(隔离性),Durable(持续性)四个词的首字母所写,下面以"银行转帐"为例来分别说明一下它们的含义: ① 原子性:组成事务处理的语句形成了一个逻辑单元,不能只执行其中的一部分.换句话说,事务是不可分割的最小单元.比如:银行转帐过程中,必须同时从一个帐户减去转帐金额,并加到另一个

随机推荐