PHP MySQL (三)面向对象 事务
事务
特性:(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 协议》,转载必须注明作者和本文链接
推荐文章: