MySQL事务

时间:2019-11-20 08:52:08  来源:igfitidea点击:

简介:在本教程中,您将了解MySQL事务以及如何使用COMMIT和ROLLBACK语句在MySQL中管理事务。

MySQL事务简介

要了解MySQL中的交易是什么,让我们看一个在示例数据库中添加新销售订单的示例。
添加销售订单的步骤如下所述:

  • 首先,从订单表中查询最新的销售订单号,然后使用下一个销售订单号作为新的销售订单号。

  • 接下来,在订单表中插入一个新的销售订单。

  • 然后,获取新插入的销售订单号

  • 之后,将新的销售订单项目与销售订单编号一起插入orderdetails表中

  • 最后,从orders和orderdetails表中选择数据以确认更改

现在,想象一下如果由于诸如表锁定之类的某些原因而导致上述一个或多个步骤失败,将会对销售订单数据产生什么影响?例如,如果将订单商品添加到orderdetails表的步骤失败,则您将有一个空的销售订单。

这就是为什么要进行交易处理的原因。
MySQL事务允许您执行一组MySQL操作,以确保数据库永远不会包含部分操作的结果。
在一组操作中,如果其中一个操作失败,则会发生回滚以将数据库还原到其原始状态。
如果没有错误发生,则将整个语句集提交给数据库。

MySQL事务语句

MySQL为我们提供了以下重要语句来控制事务:

  • 要启动事务,请使用START TRANSACTION语句。
    BEGIN或BEGIN WORK是START TRANSACTION的别名。

  • 要提交当前事务并使它的更改永久生效,请使用COMMIT语句。

  • 要回滚当前事务并取消其更改,请使用ROLLBACK语句。

  • 要禁用或启用当前事务的自动提交模式,请使用SET自动提交语句。

默认情况下,MySQL自动将更改永久提交到数据库。
要强制MySQL不自动提交更改,请使用以下语句:

SET autocommit = 0;

要么

SET autocommit = OFF

您可以使用以下语句来显式启用自动提交模式:

SET autocommit = 1;

要么

SET autocommit = ON;

MySQL交易示例

我们将使用示例数据库中的orders and orderDetails表进行演示。

COMMIT示例

为了使用事务,您首先必须将SQL语句分解为逻辑部分,并确定何时应提交或回退数据。

下面说明了创建新销售订单的步骤:

  • 首先,使用START TRANSACTION语句启动事务。

  • 接下来,从订单表中选择最新的销售订单号,然后使用下一个销售订单号作为新的销售订单号。

  • 然后,将新的销售订单插入订单表。

  • 之后,将销售订单项目插入orderdetails表中。

  • 最后,使用COMMIT语句提交事务。

(可选)您可以从订单和订单明细表中选择数据以检查新的销售订单。

以下是执行上述步骤的脚本:

-- 1. start a new transaction
START TRANSACTION;

-- 2. Get the latest order number
SELECT 
    @orderNumber:=MAX(orderNUmber)+1
FROM
    orders;

-- 3. insert a new order for customer 145
INSERT INTO orders(orderNumber,
                   orderDate,
                   requiredDate,
                   shippedDate,
                   status,
                   customerNumber)
VALUES(@orderNumber,
       '2005-05-31',
       '2005-06-10',
       '2005-06-11',
       'In Process',
        145);
        
-- 4. Insert order line items
INSERT INTO orderdetails(orderNumber,
                         productCode,
                         quantityOrdered,
                         priceEach,
                         orderLineNumber)
VALUES(@orderNumber,'S18_1749', 30, '136', 1),
      (@orderNumber,'S18_2248', 50, '55.09', 2); 
      
-- 5. commit changes    
COMMIT;

要获取新创建的销售订单,请使用以下查询:

SELECT 
    a.orderNumber,
    orderDate,
    requiredDate,
    shippedDate,
    status,
    comments,
    customerNumber,
    orderLineNumber,
    productCode,
    quantityOrdered,
    priceEach
FROM
    orders a
        INNER JOIN
    orderdetails b USING (orderNumber)
WHERE
    a.ordernumber = 10426;

这是输出:

ROLLBACK示例

首先,登录到MySQL数据库服务器并从orders表中删除数据:

mysql> START TRANSACTION;
Query OK, 0 rows affected (0.00 sec)

mysql> DELETE FROM orders;
Query OK, 327 rows affected (0.03 sec)

从输出中可以看到,MySQL确认订单表中的所有行均已删除。

其次,在单独的会话中登录到MySQL数据库服务器,并从订单表中查询数据:

mysql> SELECT COUNT(*) FROM orders;
+----------+
| COUNT(*) |
+----------+
|      327 |
+----------+
1 row in set (0.00 sec)

在第二部分中,我们仍然可以从订单表中看到数据。

我们在第一届会议上进行了更改。
但是,更改不是永久的。
在第一个会话中,我们可以提交或回滚更改。

出于演示目的,我们将在第一届会议上回滚所做的更改。

mysql> ROLLBACK;
Query OK, 0 rows affected (0.04 sec)

在第一届会议上,我们还将验证订单表的内容:

mysql> SELECT COUNT(*) FROM orders;
+----------+
| COUNT(*) |
+----------+
|      327 |
+----------+
1 row in set (0.00 sec)

从输出中可以清楚地看到,更改已回滚。

在本教程中,您学习了如何使用包含START TRANSACTION COMMI和ROLLBACK的MySQL事务语句来管理事务。