`

MySql中的事务问题

阅读更多

       今天非常开心,因为终于将昨天一个让我很郁闷的问题解决了。事情是这样的,根据业务逻辑的要求,需要对两张数据表进行更新,为了保证数据的完整性,就需要使用transaction的概念了。如以下代码所示:

conn.setAutoCommit(false);
try 
{
    PreparedStatement insertStatement 
= conn.prepareStatement("INSERT INTO CUSTOM_ORDER(CUSTOMER, ORDER_LIST) VALUES(?, ?)");
    insertStatement.setString(
1, customer);
    insertStatement.setString(
2, orderList);
    insertStatement.execute();

    PreparedStatement updateStatement 
= conn.prepareStatement("UPDATE PLAYER SET ACCOUNT = ACCOUNT - ? WHERE ID = ?");
    updateStatement.setInt(
1, sumPrice);
    updateStatement.setString(
2, customer);
    updateStatement.execute(); 
    
    conn.commit();
}
 
catch(SQLException se)
{
    conn.rollback();
}

finally
{
    conn.close();
}

        代码很简单,而且根据我以前的经验来看,这样的代码是可以保证数据完整性的,因为对数据表两个连续的更新是一个事务,当发生异常的时候,事务会回滚。然而,测试的结果出乎意料,即使第二个SQL语句执行发生了异常,第一个SQL产生的更新结果也会体现到数据表中。查阅了很多资料,都没有发现这样的代码会有什么问题,而且Java Tutorial对于事务的介绍所给出的例子跟以上代码十分的类似,讲解中也提到两个preparedStatment只有在commit方法被调用的时候,才会作用于数据库。后来我在第一个execute方法之后设置了断点,竟然发现在执行完该方法之后,CUSTOM_ORDER表中已经多了一条记录了。但是此时,我并没有想到这会跟数据库本身有关,拼命在Google上找与JDBC相关的资料。
        最后,在跟一位朋友讨论这个问题的时候,他问我:“你用的什么数据库啊?”我说是MySql,他马上很肯定的告诉我,MySql不支持事务。“不支持事务?!”我立即去查阅了MySql相关的资料[1],果然,MySql在4.0系列之前确实是没有支持事务的。我的朋友曾在3.x系列版本的MySql下面做了两年的开发,因此才会这样告诉我这样的结论。然而4.x系列是可以支持事务的啊,我用的是4.0.16自然也支持了,为什么还会出现这样的情况呢?
        原来,MySql的数据表分为两类,一类是传统的数据表,另一类则是支持事务的数据表。支持事务的数据表分为两种:InnoDB和BerkeleyDB。我们可以通过以下的命令确认安装的MySql Server是否支持这两种数据表:
        SHOW VARIABLES LIKE 'have_innodb';
        SHOW VARIABLES LIKE 'have_bdb';
即使MySql Server本身是支持这两种数据表,但是并不代表着创建新表的时候,新表就是属于这两种的。通常,在创建新表的时候,如果没有加以特别的说明,那么创建的新表则是传统的数据表,是不会支持事务的。因此,我的问题也就解决了,因为以上的示例代码操作的是两张没有支持事务的数据表,怎么可能去处理事务呢?
        通常我们可以通过使用如下的方式来创建支持事务的数据表:
        CREATE TABLE TABLE_NAME(FIELD1, FIELD2.... FIELDn) TYPE=INNODB;
如果原来建好的数据表,我们也可以通过ALTER TABLE命令直接去改变数据表的类型,而不需要备份数据,然后Drop表,再建立新表,再导入数据这样烦琐的步骤。如:
        ALTER TABLE TABLE_NAME TYPE=INNODB;
       
       [1] Using Transaction in MySQL
  

分享到:
评论

相关推荐

    MySQL中的事务(MySQL与事务)

    简单说明了MySQL的事务。 事务的由来,事务在MySQL中的用法。

    mySQL事务处理

    关于mysql的事务处理 public static void StartTransaction(Connection con, String[] sqls) throws Exception { if (sqls == null) { return; } Statement sm = null; try { // 事务开始 System....

    mysql分布式事务实现 MySQL XA pdf

    MySQL服务器作为资源管理器,在分布式事务中扮演着核心角色。客户端通过连接到MySQL服务器并使用XA协议来进行分布式事务的管理和控制。MySQL的XA实现允许应用程序通过两阶段提交(2PC)协议来确保分布式事务的一致性。...

    MySQL与事务

    本文将详细介绍MySQL中的事务处理机制,尤其是InnoDB存储引擎下如何确保事务的ACID特性。 #### 二、事务处理的基本概念 事务处理在数据库中是非常重要的一个概念,它确保了一系列操作要么全部成功完成,要么完全不...

    PHP MySQL 与 MsSQL 中的事务

    1. **原子性**:事务中的所有操作被视为一个不可分割的工作单元,要么全部完成,要么全部不执行。 2. **一致性**:事务将数据库从一种一致状态转换到另一种一致状态。 3. **隔离性**:事务的执行不能被其他事务干扰...

    Mysql事务的隔离性

    ### MySQL事务的隔离性 #### 一、事务与MySQL架构 **事务**是数据库管理系统执行过程中的一系列逻辑操作,这些操作作为一个完整的单元被执行。如果事务内的所有操作都成功完成,则整个事务成功;如果其中一个操作...

    MySQL事务隔离级别

    MySQL事务隔离级别是数据库管理系统中一个非常重要的概念,它关系到数据的一致性和并发性能。在MySQL中,事务被用于确保数据库操作的原子性、一致性、隔离性和持久性(ACID特性)。事务隔离级别主要涉及四个方面:读...

    mysql支持事务配置,配置InnoDB引擎

    本文将详细介绍如何在MySQL中配置支持事务的操作以及启用InnoDB存储引擎的方法。 #### 二、InnoDB存储引擎简介 InnoDB是MySQL中默认的存储引擎之一,提供了ACID事务的支持,确保数据的一致性和可靠性。此外,InnoDB...

    nodejs + mysql 事务处理问题

    nodejs + mysql 事物处理问题 呵呵 看了就知道 记得npm install啊 需要的东西啊 本想免费 苦于没积分 ,需要的的同学,给点分吧

    mysql-事件,触发器,事务-实验七.docx

    如果事务中的某个操作失败了,整个事务将回滚到初始状态。事务有两个优点:一是可以确保数据的一致性和安全性;二是可以提高数据库的可靠性和可用性。 MySQL 模式是 MySQL 中的一种机制,可以控制数据库的行为和...

    MySQL的四种事务隔离级别

    2. 在读已提交隔离级别中,事务只能读取已经提交的数据,解决了脏读问题,但事务中的数据读取可能会出现不一致的情况,即不可重复读。 3. 在可重复读隔离级别中,事务多次读取同一数据时,即使其他事务已经提交了对...

    mysql事务学习资料(PPT+源码)

    6. **案例源码分析**:压缩包中的源码可能包括了创建和管理事务的示例,例如如何在一个事务中执行多个DML(数据操纵语言)语句,如何在事务中处理错误并回滚,以及如何利用隔离级别解决常见的并发问题,如脏读、不可...

    MySQL8.0锁机制和事务

    MySQL 8.0 中的锁机制和事务是数据库系统中非常重要的概念。锁机制是指数据库系统中对数据访问的控制机制,而事务是指数据库系统中的一组操作单元。了解锁机制和事务是非常关键的,因为它们直接影响着数据库系统的...

    jdbc+spring+mysql事务理解和分析

    以下是对`jdbc+spring+mysql事务理解和分析`的详细说明: 1. **原子性(Atomicity)**:这是事务的基本特性,表示事务中的所有操作要么全部成功,要么全部回滚。如果在事务执行过程中发生错误,数据库会撤销所有已...

    mysql事务处理用法与实例详解

    ### MySQL事务处理用法与实例详解 #### 一、事务的概念及重要性 在数据库管理中,事务(Transaction)是指一系列作为一个整体的操作序列。这些操作要么全部成功,要么全部失败,不能只执行其中的一部分。事务处理...

    Mysql事务的基本使用-基本原理及特点ACID

    3. **回滚事务**:`ROLLBACK`,如果事务中有任何SQL语句执行失败,或者遇到错误,可以使用此命令撤销自上一次提交或事务开始以来的所有更改。 #### 三、事务的基本原理 在MySQL中,如果不显式地开启事务,每执行一...

    MySQL编程与事务

    MySQL编程与事务,数据控制语言DCL,事务控制语言(DTL)

Global site tag (gtag.js) - Google Analytics