如何应用PHP的事务处理机制处理转账过程中可能遇到的意外
应用事务处理技术实现转账的代码如下:
$tob=$_POST['tob'; //注:请补充'tob'后边一个“]”,腾讯的编辑器总是把它过滤了。 $conn=new mysqli("localhost","root","root","db_database09"); $conn->query("set names gb2312"); $conn->autocommit(false); if(!$conn->query("update tb_zy set money=money-'".$tob."' where flag='mrsoft'")){ $conn->rollback(); } if(!$conn->query("update tb_zy set money=money+'".$tob."' where flag='mr'")){ $conn->rollback(); } $conn->commit(); $conn->autocommit(true); echo "<SCRIPT>window.location.href='index.php';</SCRIPT>"; 首先调用mysqli类的autocommit()方法关闭数据库的自动提交(MySQL数据库默认为自动提交),然后减少A账户一定数量的金额,并判断 查询是否顺利执行,如果在此过程中发生意外,则通过调用mysqli类的rollback()方法回滚,不做任何处理,反之为B账户增加相同的金额。最后 通过调用mysqli类的commit()方法提交查询,实现转账。 <?php $handler = mysql_connect("localhost", "root", ""); mysql_select_db("task"); mysql_query("SET AUTOCOMMIT=0"); //设置为不自动提交,因为MYSQL默认立即执行 mysql_query("BEGIN"); //开始事务定义 if (!mysql_query("insert into trans (id) values('2')")) { mysql_query("ROOLBACK"); //判断当执行失败时回滚 } if (!mysql_query("insert into trans (id) values('4')")) { mysql_query("ROOLBACK"); //判断执行失败回滚 } mysql_query("COMMIT"); //执行事务 mysql_close($handler); ?> <完> 其它相关内容: MYSQL的事务处理主要有两种方法。 1、用begin,rollback,commit来实现 begin 开始一个事务 rollback 事务回滚 commit 事务确认 2、直接用set来改变mysql的自动提交模式 MYSQL默认是自动提交的,也就是你提交一个QUERY,它就直接执行!我们可以通过 set autocommit=0 禁止自动提交 set autocommit=1 开启自动提交 来实现事务的处理。 但注意当你用 set autocommit=0 的时候,你以后所有的SQL都将做为事务处理,直到你用commit确认或rollback结束,注意当你结束这个事务的同时也开启了个新的事务!按第一种方法只将当前的作为一个事务! 个人推荐使用第一种方法! MYSQL中只有INNODB和BDB类型的数据表才能支持事务处理!其他的类型是不支持的!(切记!) PHP中的事务处理函数 PHP中的MySQLi插件引进了新的函数,帮助开发者利用MySQL的事务处理能力。实质上,这些函数对等地被叫做SQL START TRANSACTION,COMMIT和 ROLLBACK命令。列表A为你展示了一个例子,列表A: // connect to database $dbh = mysqli_connect($host, $user, $pass, $db); // turn off auto-commit mysqli_autocommit($dbh, FALSE); // run query 1 $result = mysqli_query($dbh, $query1); if ($result !== TRUE) { mysqli_rollback($dbh); // if error, roll back transaction } // run query 2 $result = mysqli_query($dbh, $query2); if ($result !== TRUE) { mysqli_rollback($dbh); // if error, roll back transaction } // and so on... // assuming no errors, commit transaction mysqli_commit($dbh); // close connection mysqli_close($dbh); ?>
// connect to database $dbh = mysqli_connect("localhost", "user", "www.iiwnet.com", "test") or die("Cannot connect"); // turn off auto-commit mysqli_autocommit($dbh, FALSE); // look for a transfer if ($_POST['submit'] && is_numeric($_POST['amt'])) { // add $$ to target account $result = mysqli_query($dbh, "UPDATE accounts SET balance = balance + " . $_POST['amt'] . " WHERE id = " . $_POST['to']); if ($result !== TRUE) { mysqli_rollback($dbh); // if error, roll back transaction } // subtract $$ from source account $result = mysqli_query($dbh, "UPDATE accounts SET balance = balance - " . $_POST['amt'] . " WHERE id = " . $_POST['from']); if ($result !== TRUE) { mysqli_rollback($dbh); // if error, roll back transaction } // assuming no errors, commit transaction mysqli_commit($dbh); } // get account balances // save in array, use to generate form $result = mysqli_query($dbh, "SELECT * FROM accounts"); while ($row = mysqli_fetch_assoc($result)) { $accounts[] = $row; } // close connection mysqli_close($dbh); ?>
更多:PHP教程