新聞中心
MySQL事務(wù)是一組原子性的SQL操作序列,這些操作要么全部成功執(zhí)行,要么全部失敗回滾,事務(wù)具有ACID特性,即原子性(Atomicity)、一致性(Consistency)、隔離性(Isolation)和持久性(Durability),在實(shí)際應(yīng)用中,事務(wù)常用于實(shí)現(xiàn)數(shù)據(jù)的完整性和一致性。

創(chuàng)新互聯(lián)建站專業(yè)為企業(yè)提供大關(guān)網(wǎng)站建設(shè)、大關(guān)做網(wǎng)站、大關(guān)網(wǎng)站設(shè)計(jì)、大關(guān)網(wǎng)站制作等企業(yè)網(wǎng)站建設(shè)、網(wǎng)頁(yè)設(shè)計(jì)與制作、大關(guān)企業(yè)網(wǎng)站模板建站服務(wù),十年大關(guān)做網(wǎng)站經(jīng)驗(yàn),不只是建網(wǎng)站,更提供有價(jià)值的思路和整體網(wǎng)絡(luò)服務(wù)。
下面通過(guò)一個(gè)實(shí)例來(lái)詳細(xì)介紹如何使用MySQL事務(wù)。
假設(shè)我們有一個(gè)在線購(gòu)物網(wǎng)站,用戶可以在網(wǎng)站上購(gòu)買(mǎi)商品,在用戶下單時(shí),需要對(duì)庫(kù)存表進(jìn)行減操作,同時(shí)在訂單表中插入一條記錄,這兩個(gè)操作需要作為一個(gè)整體來(lái)執(zhí)行,要么都成功,要么都失敗,為了實(shí)現(xiàn)這個(gè)需求,我們可以使用MySQL事務(wù)。
1、創(chuàng)建數(shù)據(jù)庫(kù)和表
我們需要?jiǎng)?chuàng)建一個(gè)數(shù)據(jù)庫(kù)和一個(gè)庫(kù)存表,用于存儲(chǔ)商品的庫(kù)存信息。
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);
接下來(lái),我們創(chuàng)建一個(gè)訂單表,用于存儲(chǔ)用戶的訂單信息。
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、編寫(xiě)事務(wù)處理程序
在PHP中,我們可以使用mysqli擴(kuò)展來(lái)實(shí)現(xiàn)MySQL事務(wù),以下是一個(gè)簡(jiǎn)單的示例:
connect_error) {
die("連接失敗: " . $conn>connect_error);
}
// 開(kāi)始事務(wù)
$conn>begin_transaction();
try {
// 減少庫(kù)存數(shù)量
$stmt1 = $conn>prepare("UPDATE inventory SET quantity = quantity ? WHERE product_id = ?");
$stmt1>bind_param("ii", $quantity, $product_id);
$quantity = 1; // 購(gòu)買(mǎi)數(shù)量
$product_id = 1; // 購(gòu)買(mǎi)商品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();
// 如果以上兩個(gè)操作都成功,則提交事務(wù);否則回滾事務(wù)。
if ($stmt1>affected_rows > 0 && $stmt2>affected_rows > 0) {
$conn>commit();
echo "購(gòu)買(mǎi)成功!";
} else {
$conn>rollback();
echo "購(gòu)買(mǎi)失?。?;
}
} catch (Exception $e) {
// 如果發(fā)生異常,回滾事務(wù)。
$conn>rollback();
echo "購(gòu)買(mǎi)失敗!";
} finally {
// 關(guān)閉連接。
$stmt1>close();
$stmt2>close();
$conn>close();
}
?>
在這個(gè)示例中,我們首先創(chuàng)建了一個(gè)連接到MySQL數(shù)據(jù)庫(kù)的連接對(duì)象,我們使用begin_transaction()方法開(kāi)始一個(gè)新的事務(wù),接下來(lái),我們編寫(xiě)了兩個(gè)SQL語(yǔ)句,分別用于減少庫(kù)存數(shù)量和插入訂單記錄,這兩個(gè)操作需要作為一個(gè)整體來(lái)執(zhí)行,要么都成功,要么都失敗,我們將它們放在一個(gè)try塊中,如果這兩個(gè)操作都成功執(zhí)行,則使用commit()方法提交事務(wù);否則,使用rollback()方法回滾事務(wù),我們關(guān)閉了與數(shù)據(jù)庫(kù)的連接。
網(wǎng)站名稱:MySQL事務(wù)實(shí)例分享
URL網(wǎng)址:http://m.5511xx.com/article/codcohe.html


咨詢
建站咨詢
