MySQL事务

 

MySQL事务

事务处理机制在程序开发过程中有着非常重要的作用,它可以使整个系统更加安全,例如在银行处理转账业务时,如果A账户中的金额刚被发出,而B账户还没来得及接收就发生停电,这会给银行和个人带来很大的经济损失。采用事务处理机制,一旦在转账过程中发生意外,则程序将回滚,不做任何处理。

实例265:使用事务处理技术实现关联表间信息的删除

实例说明

MySQL数据库中的表可以通过主键相互关联,例如学生成绩管理系统中,学生表和成绩表可以通过id实现关联,所以在删除某个学生信息时,只需删除这两个表中为该id的所有记录。但是,当对成绩表实现删除相关id工作后,还没来得及删除学生信息表中该学生的信息时就发生停电等意外,则再重新查找该学生的成绩时,是无法查找到该学生成绩的。

本实例将采用事务处理方式,对学生信息表和学生成绩表中的数据进行删除,运行本实例,学生信息及学生成绩信息分别如图9.18及图9.19所示。当删除图9.18中的学生信息后,查看学生成绩信息可以发现与该学生对应的成绩全部删除。

图9.19 查看学生信息
图9.18 查看学生成绩

技术要点

实现事务的处理可以通过PHP预定义类mysqli的以下方法实现。
autocommit(boolean):该方法用于限定查询结果是否自动提交,如果该方法的参数为true则自动提交,如果参数为false则关闭自动提交。MySQL数据库默认为自动提交。
rollback():利用mysqli类中的该方法可以实现事务的回滚。
commit():利用该方法可以实现提交所有查询。

实现过程

(1)建立数据库及数据表,并实现与数据库的连接。实现与数据库建立连接的代码如下:

<?php
include_once("conn.php");
$sql=$conn->query("select * from tb_stu"); 
$info=$sql->fetch_array(MYSQLI_ASSOC);
if($info==NULL)
{
echo "暂无学生信息!";
} 
else
{
do
{
?> 
<tr>
<td height="25" bgcolor="#FFFFFF"><div align="center">
<?php echo $info[sname];?></div></td>
<td height="25" bgcolor="#FFFFFF"><div align="center">
<?php echo $info[sno];?></div></td>
<td height="25" bgcolor="#FFFFFF"><div align="center">
<?php echo $info[sage];?></div></td>
<td height="25" bgcolor="#FFFFFF"><div align="center">
<?php echo $info[saddress];?></div></td>
<td height="25" bgcolor="#FFFFFF"><div align="center">
<?php echo $info[ssfzh];?></div></td>
<td bgcolor="#FFFFFF"><div align="center">
<a href="javascript:if(window.confirm('确定删除该学生信息么?')==true)
{window.location.href='delete.php?id=<?php echo $info[id];?>';}">删除</a></div></td>
</tr>
<?php
}
while($info=$sql->fetch_array(MYSQLI_ASSOC));
}
?>


(2)显示所有学生基本信息。代码如下:
在实现该模块功能时,可以利用JavaScript实现该页与delete.php页面的信息传递。代码如下:

<a href="javascript:if(window.confirm('确定删除该学生信息么?')==true)
{window.location.href='delete.php?id=<?php echo $info[id];?>';}">删除</a>


window对象的confirm()方法用于弹出一个对话框,用于提示用户是否真正删除某学生的所有信息。
(3)利用事务处理机制对学生基本信息进行删除。代码如下:

<?php
$id=$_GET[id];
include_once("conn.php");
$conn->autocommit(false);
if(!$conn->query("delete from tb_sco where id='".$id."'"))
{
$conn->rollback();
}
if(!$conn->query("delete from tb_stu where id='".$id."'"))
{
$conn->rollback();
}
$conn->commit();
$conn->autocommit(true);
echo "<script>window.location.href='index.php';</script>";
?>

举一反三

根据本实例,读者可以:
实现学生信息的批量删除。
实现银行的转账处理。

实例262:使用事务处理技术实现银行的安全转账

实例说明

在实现银行转账过程中,发生意外是在所难免的,为了避免因意外而造成不必要的损失,在银行转账时经常使用事务处理方式。运行本实例,如图9.20所示,在图中的文本框中输入要转给B账户的金额后,单击“转账”按钮即可实现转账。

 

图9.20 银行转账

技术要点

本实例的关键技术是如何应用PHP的事务处理机制处理转账过程中可能遇到的意外。事务处理方式是个不错的选择。本实例应用事务处理技术实现转账的代码如下:

$tob=$_POST[tob];
include_once("conn.php");
$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()方法关闭数据库的自动提交,然后减少A账户一定数量的金额,并判断查询是否顺利执行,如果在此过程中发生意外,则通过调用mysqli类的rollback()方法回滚,不做任何处理,反之为B账户增加相同的金额。最后通过调用mysqli类的commit()方法提交查询,实现转账。

实现过程

(1)利用mysqli扩展技术实现与MySQL数据库的连接。代码如下:

$conn=new mysqli("localhost","root","root","db_database09");
$conn->query("set names gb2312");
?>

(2)查询A账户与B账户的现有金额并在页面中显示。代码如下:

include_once("conn.php");
$sql=$conn->query("select * from tb_zy where flag='mrsoft'");
$info=$sql->fetch_array(MYSQLI_ASSOC);
$sql1=$conn->query("select * from tb_zy where flag='mr'");
$info1=$sql1->fetch_array(MYSQLI_ASSOC);
?>

举一反三

根据本实例,读者可以:
实现多用户同时转账。
实现自动转账。