php事務(wù)保存指的是在數(shù)據(jù)處理中,將一系列的操作綁定在一起,只有當(dāng)所有操作都執(zhí)行成功時(shí),才將結(jié)果提交到數(shù)據(jù)庫(kù)中,否則所有操作都將被撤銷。
假設(shè)我們有一個(gè)訂單處理系統(tǒng),涉及到兩張表:訂單表(order)和訂單詳情表(order_detail)。訂單表保存每個(gè)訂單的基本信息,比如訂單號(hào)、訂單金額等等;訂單詳情表保存每個(gè)訂單對(duì)應(yīng)的商品信息。
CREATE TABLEorder
(id
int(11) NOT NULL AUTO_INCREMENT COMMENT '主鍵',order_no
varchar(20) DEFAULT NULL COMMENT '訂單號(hào)',order_amount
decimal(10,2) DEFAULT NULL COMMENT '訂單金額', PRIMARY KEY (id
) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='訂單表'; CREATE TABLEorder_detail
(id
int(11) NOT NULL AUTO_INCREMENT COMMENT '主鍵',order_id
int(11) NOT NULL COMMENT '訂單id',goods_name
varchar(50) DEFAULT NULL COMMENT '商品名稱',goods_quantity
int(11) DEFAULT NULL COMMENT '商品數(shù)量', PRIMARY KEY (id
) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='訂單詳情表';
如果我們?cè)谔幚砻總€(gè)訂單時(shí),需要向這兩張表中插入數(shù)據(jù),為了防止出現(xiàn)數(shù)據(jù)異常,可以將這兩個(gè)操作綁定在一起,只有當(dāng)兩個(gè)操作都成功時(shí),才將結(jié)果提交到數(shù)據(jù)庫(kù)中。
$pdo = new PDO('mysql:host=localhost;dbname=test', 'root', '123456'); // 開啟事務(wù) $pdo->beginTransaction(); // 插入訂單數(shù)據(jù) $sql = "INSERT INTOorder
(order_no
,order_amount
) VALUES (:order_no, :order_amount)"; $stmt = $pdo->prepare($sql); $stmt->bindParam(':order_no', $order_no); $stmt->bindParam(':order_amount', $order_amount); $res1 = $stmt->execute(); // 插入訂單詳情數(shù)據(jù) foreach ($order_goods as $goods) { $sql = "INSERT INTOorder_detail
(order_id
,goods_name
,goods_quantity
) VALUES (:order_id, :goods_name, :goods_quantity)"; $stmt = $pdo->prepare($sql); $stmt->bindParam(':order_id', $order_id); $stmt->bindParam(':goods_name', $goods['name']); $stmt->bindParam(':goods_quantity', $goods['quantity']); $res2 = $stmt->execute(); } // 判斷是否執(zhí)行成功 if ($res1 && $res2) { // 提交事務(wù) $pdo->commit(); echo '訂單添加成功'; } else { // 回滾事務(wù) $pdo->rollBack(); echo '訂單添加失敗'; }
如果在插入訂單詳情數(shù)據(jù)時(shí)發(fā)生了異常,訂單數(shù)據(jù)已經(jīng)插入成功,但是訂單詳情數(shù)據(jù)卻沒有插入成功,因此需要回滾事務(wù),保證數(shù)據(jù)一致性。
php事務(wù)保存能夠有效地保證數(shù)據(jù)的完整性,避免出現(xiàn)數(shù)據(jù)異常,是開發(fā)高質(zhì)量數(shù)據(jù)處理系統(tǒng)的必備工具。