一,php事务处理的概述
事务:若干个事件的集合
事务处理具有四个特性:原子性、一致性、独立性、持久性。
事务处理:当所有事件执行成功,事务才执行;若有任何一个事件不能成功执行,事务的其它事件也不被执行。
只要你的MySQL版本支持BDB或InnoDB表类型,那么你的MySQL就具有事务处理的能力。这里面,又以InnoDB表类型用的最多,虽然后来发生了诸如Oracle收购InnoDB等令MySQL不爽的事情,但是这类商业事件与技术无关,下面就以InnoDB表类型为例简单说一下MySQL中的事务处理。
配置事务处理需注意:
1、关闭 PDO 的自动提交;
$pdo->setAttribute(PDO::ATTR_AUTOCOMMIT, false);
2、开启一个事务需要的方法;
$pdo->beginTransaction(); // 开启一个事务
3.$pdo->commit(); // 提交事务
4.$pdo->rollback(); // 回滚事务
一般事务处理是运行在 try...catch...语句中,当事务失败时执行 catch 代码段。
二 以下是事务处理的一些代码
<?php
try {
$pdo->beginTransaction(); // 开启一个事务
$row = null;
$row = $pdo->exec("xxx");
// 执行第一个 SQL
if (!$row) throw new PDOException('提示信息或执行动作'); // 如出现异常提示信息或执行动作
$row = $pdo->exec("xxx");
// 执行第二个 SQL
if (!$row) throw new PDOException('提示信息或执行动作');
$pdo->commit();
}
catch (PDOException $e)
{
$pdo->rollback(); // 执行失败,事务回滚
exit($e->getMessage()
);
} ?>
下面的案例大家可以参考一下
<?php
try
{
$pdo
=
new
PDO(
"mysql:host=localhost;dbname=psp"
,
"root"
,
""
);
$pdo
->
exec
(
"set names utf8"
);
$pdo
->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
//设置异常处理模式
$pdo
->setAttribute(PDO::ATTR_AUTOCOMMIT,0);
//关闭自动提交
}
catch
(PDOException
$e
){
echo
"数据库连接失败"
;
exit
;
}
try
{
$age
=10;
$pdo
->beginTransaction();
//开始事务
$affected_rows1
=
$pdo
->
exec
(
"update kfry set k_age=k_age+{$age} where k_name='user1'"
);
$affected_rows2
=
$pdo
->
exec
(
"update kfry set k_age=k_age-{$age} where k_name='user2'"
);
//随意更改使之执行成功或失败
/* if($affected_rows1&&$affected_rows2)
{
$pdo->commit();
echo "操作成功";
}else{
$pdo->rollback();
} */
if
(!
$affected_rows1
)
throw
new
PDOException(
"加入错误"
);
if
(!
$affected_rows2
)
throw
new
PDOException(
"减少错误"
);
echo
"操作成功"
;
$pdo
->commit();
//如果执行到此处前面两个更新sql语句执行成功,整个事务执行成功
}
catch
(PDOException
$e
){
echo
"操作失败:"
.
$e
->getMessage();
$pdo
->rollback();
//执行事务中的语句出了问题,整个事务全部撤销
}
$pdo
->setAttribute(PDO::ATTR_AUTOCOMMIT,1);
//测试是否成功
echo
"\n操作结果为:\n"
;
$sql
=
"select * from kfry"
;
$result
=
$pdo
->query(
$sql
);
foreach
(
$result
as
$v
)
{
echo
$v
[
'k_name'
].
" "
.
$v
[
'k_age'
].
"\n"
;
}
?>