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()
方法回滚事务,我们关闭了与数据库的连接。
原创文章,作者:未希,如若转载,请注明出处:https://www.kdun.com/ask/510120.html
本网站发布或转载的文章及图片均来自网络,其原创性以及文中表达的观点和判断不代表本网站。如有问题,请联系客服处理。
发表回复