mysql事务处理(银行转账实例)

 费德  2016/06/08 23:45  1,177 次

事务的作用主要是在服务器发生错误或者崩溃的情况下确保数据的一致性。事务是一个或者一系列的查询,这些查询要么全部执行要么执行要么全部不执行。例如,银行转账需要两个过程来完成,首先需从某个账户扣除一定金额,之后在另个账户中增加相同的金额。如果这两个过程不同时,从第一个账户中扣除金额后没来得及增加第二个账户的金额就发生停电或者服务器崩溃,这将给用户和银行造成很大的损失。如果采用事务处理上述过程,即使出现上述事故也不会给用户带来损失。一个事务被永久的写入到数据库中称事务提交,将状态重置到事务开始之前的状态称为事务回滚
本节通过具体实例来介绍PHP是如何处理MYSQL事务的。PHP处理MySql事务是通过PHP中的预定义类mysqli来完成的,该类中与事务处理的相关方法如下:

autocommit():该方法的参数是false或者true,false表示禁止自动提交查询,true表示自动提交查询。
rollback():该方法的作用是当发生意外时,自动回滚到事务开始之前的状态。
commit():该方法的作用是提交事务。
此处将通过银行转账的过程来介绍事务处理的方式。前面已经介绍过银行转账主要有两个过程来完成,也就是需要执行两个查询,在这里用tb_money代表金额表,用money代表金额字段,用user_out和user_in来分别表示汇款人和收款人。
代码如下:

$conn = new mysqli("localhost","root","","user")or die("连接失败");  
$conn->query("set names utf-8",MYSQLI_USE_RESULT);  
$conn->autocommit(false);  

$sql1 = "update tb_money set money= money-1000 where id=1";//一个账户减少1000  

$result1 = $conn->query($sql1, MYSQLI_USE_RESULT);  
if (!$result1){  
    $conn->rollback();//回滚  
}  

$sql2 = "update tb_money set money=money+1000 where id=2";//一个账户增加1000  
$result2 = $conn->query($sql2, MYSQLI_USE_RESULT);  
if (!$result2){  
    $conn->rollback();//回滚  
}  

$conn->commit();//提交事务  
$conn->autocommit(true);//自动提交为真  
$conn->close();//数据库连接关闭

 作者:费德

少年费德的奇幻漂流

本博客如无特殊说明皆为原创,转载请注明来源:mysql事务处理(银行转账实例)

添加新评论