特性:(ACID)
原子性(Atomicity,或稱不可分割性)、一致性(Consistency)、隔離性(Isolation,又稱獨立性)、永續性(Durability)。
使用場景簡易說明:A賬戶給B賬戶轉賬100大洋
正常情況下,A賬戶減少100大洋,B賬戶增加100大洋。
不正常情況下,A賬戶減少了100大洋,系統故障,B賬戶沒有增加100大洋。
不正常情況下,A賬戶沒有減少100大洋,而B賬戶增加了100大洋。如何解決資料一致性的問題,使用事務機制就能夠保證資料的一致性
簡易示例
<?php
//mysql事務
header('content-type:text/html;charset=utf-8');
$host = '127.0.0.1';
$user = 'root';
$password = 'root';
$db = 'test';
$mysqli = new mysqli($host, $user, $password, $db);
if($mysqli->connect_errno){
die($mysqli->connect_error);
}
$mysqli->set_charset('utf8');
//先關閉自動提交功能
$mysqli->autocommit(FALSE);
$sql1 = "UPDATE `account` set `money` = `money` - 200 WHERE `id` = ?";
$mysqli_stmt1 = $mysqli->prepare($sql1);//準備預處理語句
//i代表int
$mysqli_stmt1->bind_param('i',$id1);
if($mysqli_stmt1->execute()) {
if($mysqli_stmt1->num_rows > 0){
echo '更改成功';
}else{
echo '更改失敗';
}
}
$sql2 = "UPDATE `account` set `money` = `money` + 200 WHERE `id` = ?";
$mysqli_stmt2 = $mysqli->prepare($sql2);//準備預處理語句
//i代表int
$mysqli_stmt2->bind_param('i',$id2);
if($mysqli_stmt2->execute()) {
if($mysqli_stmt2->num_rows > 0){
echo '更改成功';
}else{
echo '更改失敗';
}
}
if($mysqli_stmt1->num_rows > 0 && $mysqli_stmt2->num_rows > 0){
$mysqli->commit();
$mysqli->autocommit(true);
echo '轉賬成功';
}else{
$mysqli->rollback();
echo '轉賬失敗';
}
$mysqli_stmt->close();
$mysqli->close();
本作品採用《CC 協議》,轉載必須註明作者和本文連結