当前位置:首页 > 行业动态 > 正文

MySQL事务实例分享

MySQL事务是一组原子性的SQL操作序列,这些操作要么全部成功执行,要么全部失败回滚,事务具有ACID特性,即原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)和持久性(Durability),在实际应用中,事务常用于实现数据的完整性和一致性。

下面通过一个实例来详细介绍如何使用MySQL事务。

假设我们有一个在线购物网站,用户可以在网站上购买商品,在用户下单时,需要对库存表进行减操作,同时在订单表中插入一条记录,这两个操作需要作为一个整体来执行,要么都成功,要么都失败,为了实现这个需求,我们可以使用MySQL事务。

1、创建数据库和表

我们需要创建一个数据库和一个库存表,用于存储商品的库存信息。

CREATE DATABASE online_shopping;
USE online_shopping;
CREATE TABLE inventory (
  id INT PRIMARY KEY AUTO_INCREMENT,
  product_id INT NOT NULL,
  quantity INT NOT NULL
);
INSERT INTO inventory (product_id, quantity) VALUES (1, 100);
INSERT INTO inventory (product_id, quantity) VALUES (2, 200);
INSERT INTO inventory (product_id, quantity) VALUES (3, 300);

接下来,我们创建一个订单表,用于存储用户的订单信息。

CREATE TABLE orders (
  id INT PRIMARY KEY AUTO_INCREMENT,
  user_id INT NOT NULL,
  product_id INT NOT NULL,
  quantity INT NOT NULL,
  order_time DATETIME NOT NULL
);

2、编写事务处理程序

在PHP中,我们可以使用mysqli扩展来实现MySQL事务,以下是一个简单的示例:

<?php
$servername = "localhost";
$username = "username";
$password = "password";
$dbname = "online_shopping";
// 创建连接
$conn = new mysqli($servername, $username, $password, $dbname);
// 检查连接
if ($conn>connect_error) {
    die("连接失败: " . $conn>connect_error);
}
// 开始事务
$conn>begin_transaction();
try {
    // 减少库存数量
    $stmt1 = $conn>prepare("UPDATE inventory SET quantity = quantity ? WHERE product_id = ?");
    $stmt1>bind_param("ii", $quantity, $product_id);
    $quantity = 1; // 购买数量
    $product_id = 1; // 购买商品ID
    $stmt1>execute();
    // 插入订单记录
    $stmt2 = $conn>prepare("INSERT INTO orders (user_id, product_id, quantity, order_time) VALUES (?, ?, ?, NOW())");
    $stmt2>bind_param("iii", $user_id, $product_id, $quantity);
    $user_id = 1; // 用户ID
    $stmt2>execute();
    // 如果以上两个操作都成功,则提交事务;否则回滚事务。
    if ($stmt1>affected_rows > 0 && $stmt2>affected_rows > 0) {
        $conn>commit();
        echo "购买成功!";
    } else {
        $conn>rollback();
        echo "购买失败!";
    }
} catch (Exception $e) {
    // 如果发生异常,回滚事务。
    $conn>rollback();
    echo "购买失败!";
} finally {
    // 关闭连接。
    $stmt1>close();
    $stmt2>close();
    $conn>close();
}
?>

在这个示例中,我们首先创建了一个连接到MySQL数据库的连接对象,我们使用begin_transaction()方法开始一个新的事务,接下来,我们编写了两个SQL语句,分别用于减少库存数量和插入订单记录,这两个操作需要作为一个整体来执行,要么都成功,要么都失败,我们将它们放在一个try块中,如果这两个操作都成功执行,则使用commit()方法提交事务;否则,使用rollback()方法回滚事务,我们关闭了与数据库的连接。

0