应用事务处理技术实现转账的代码如下:
$handler
mysql_select_db("task");
mysql_query("SET
mysql_query("BEGIN");
if
}
if
}
mysql_query("COMMIT");
mysql_close($handler);
\?\>
<完>
其它相关内容:
但注意当你用
个人推荐使用第一种方法!
PHP中的事务处理函数
PHP中的MySQLi插件引进了新的函数,帮助开发者利用MySQL的事务处理能力。实质上,这些函数对等地被叫做SQL
//
$dbh
//
mysqli_autocommit($dbh,
//
$result
if
mysqli_rollback($dbh);
}
//
$result
if
mysqli_rollback($dbh);
}
//
//
mysqli_commit($dbh);
//
mysqli_close($dbh);
在PHP
*
*
*
工作实例
要了解这个在实践中是怎么工作的,让我们回到前面讨论过的银行转帐的例子.我们假设你的任务是建立一个简单的Web应用程序,让用户在他们的银行帐户间转帐。我们再进一步假设一个单独用户的帐户存储在一个MySQL数据库中,如下所示:
mysql>
+----+------------+---------+
|
+----+------------+---------+
|
|
|
+----+------------+---------+
3
现在,需要建立一个简单的界面,使用户能够输入一个现金数额,实现从一个帐户到另一个的转帐。实际的“交易”将用两个UPDATE语句来执行,一个将转帐金额从源帐户取出,即借方,另一个将转帐金额记入目标帐户,即贷方。假设我们所做的是在帐户之间进行转帐,那么所有帐户的可用结余总额($6000)应该一直保持不变。
列表B显示了可能的代码,列表
//
$dbh
//
mysqli_autocommit($dbh,
//
if
//
$result
balance
if
mysqli_rollback($dbh);
}
//
$result
SET
"
if
mysqli_rollback($dbh);
}
//
mysqli_commit($dbh);
}
//
//
$result
while
$accounts[]
}
//
mysqli_close($dbh);
?像你所看到的那样,脚本以连接数据库和关闭自动提交开始。然后执行一个SELECT查询,检索所有帐户的现金收支,接着构造一个有下拉式界面的表格,选择交易要用到的来源/目标帐户。图表A显示了最初的表格。
最初的表格
一旦表格完成并提交后,两个UPDATE查询就开始实际执行借和贷操作。注意每一个查询的尾端都带有一个mysqli_rollback(),如果查询失败的话,它将被激活。假设没有查询失败的话,新的收支表就通过调用mysqli_commit()储存到数据库中。那时数据库连接就被关闭。
你可以自己试一下,从Savings
交易完成之后的状况。
提示:当然,这只是一个简单的双命令的事务。通常,当有许多SQL语句要一起执行的时候,你可以用这种事务模型,一个语句的失败对其他语句有串联的影响。在这些情况下,你会发现将mysqli_query()和mysqli_rollback()的调用压缩到一个单独的用户自定义的函数中,需要的时候调用它会更加简便。
正如你所看到的那样,用PHP和MySQL执行一个事务处理模型可以使你的MySQL数据库对查询执行的错误更稳固。但是,在你开始动手重写代码和使用这个模型之前,值得注意的是,事务确实会增加系统性能管理的消耗,所以,在实现这个模型之前,做一个成本效益分析始终是个好主意
这里记录一下php操作mysql事务的一些知识
要知道,MySQL默认的行为是在每条SQL语句执行后执行一个COMMIT语句,从而有效的将每条语句独立为一个事务。但是,在使用事务时,是需要执行多条sql语句的,那么针对执行多条SQL语句来完成一个事务有两种办法:
1、关闭自动提交
如果SETAUTOCOMMIT=0;也就是关闭了自动提交,那么任何commit或rollback语句都可以触发事务提交;如果SETAUTOCOMMIT=1;也就是开启了自动提交(默认值),那么必须要以begin或者STARTTRANSACTION声明事务的开始,然后再以commit或rollback语句都可以触发事务提交。
例子:
- $db->query('SET
autocommit=0' ); - $db->query('update
member .$money.'set money=money+' where .$memberId);memberId=' - $db->query('insert
into .$money.')');mem_log(money) values(' - $db->query('commit');
- $db->query('insert
into .sql_encode($msg).')');//该条数据无法插入。因为autocommit=0test(str) values('
因此使用该方法时,注意,在事务结束。要恢复autocommit的值。
- $db->query('SET
autocommit=0' ); - $db->query('update
member .$money.'set money=money+' where .$memberId);memberId=' - $db->query('insert
into .$money.')');mem_log(money) values(' - $db->query('commit');
- $db->query('SET
autocommit=1' ); - $db->query('insert
into .sql_encode($msg).')');//恢复autocommit=1后,该语句可成功插入test(str) values('
2、显示打开一个事务
显示打开一个事务,就比上面的方法要简单些,不需要设置autocommit的值,也不用在事务结束后恢复autocommit的值。即,如果想保留autocommit开关打开,则通过begin或者STARTTRANSACTION声明事务,声明后,autocommit开关将会被禁用,直到您使用COMMIT或ROLLBACK结束事务为止,事务结束,autocommit开关将被打开。
- $db->query('START
TRANSACTION' ); - $db->query('update
member .$money.'set money=money+' where .$memberId);memberId=' - $db->query('insert
into .$money.')');mem_log(money) values(' - $db->query('commit');
- $db->query('insert
into .sql_encode($msg).')');//该条数据可以插入test(str) values('