PHP pdo 事务,代码里的一个容易踩的坑
PHP pdo 在支持事务的存储引擎(innoDB)下,可以使用以下代码实现事务
$pdo->beginTransaction();
try{
pdo−>exec(‘insertintottsets=11,t=99‘);
p
d
o
−
>
e
x
e
c
(
‘
i
n
s
e
r
t
i
n
t
o
t
t
s
e
t
s
=
11
,
t
=
99
‘
)
;
pdo->commit();
// 注意!!
}catch (Exception e){
var_dump(
e){ var_dump(
e);
$pdo->rollback();
}
上面的逻辑,在数据库插入失败时,会执行rollback,本次事务结束。
表面上看这段代码没有问题,
但是,如果你在上面【注意】的地方,还有其他代码的话。比如:
$pdo->beginTransaction();
try{
pdo−>exec(‘insertintottsets=11,t=99‘);
p
d
o
−
>
e
x
e
c
(
‘
i
n
s
e
r
t
i
n
t
o
t
t
s
e
t
s
=
11
,
t
=
99
‘
)
;
pdo->commit();
// 注意!!
throw new Exception(‘boom’);
}catch (Exception e){
var_dump(
e){ var_dump(
e);
$pdo->rollback();
}
这样一来,数据库插入没有问题,顺利commit ,但是catch到了一个其他的异常,
导致rollback也被执行了一次,这时候 pdo 会报一个错误
Uncaught PDOException: There is no active transaction in …
这是因为 beginTransaction 会让这个事务状态为 active,
而 commit 或 rollback 会让事务变成 inactive 。
显而易见,当然不能执行了 commit 后又执行 rollback 了。