这是我的剧本:
$id = $_GET['id'];
$value = $_GET['val'];
// database connection here
try{
$db_conn->beginTransaction();
// inserting
$stm1 = $db_conn->prepare("INSERT into table1 (col) VALUES (?)");
$stm1->execute(array($value));
// updating
$stm2 = $db_conn->prepare("UPDATE table2 SET col = "a new row inserted" WHERE id = ?");
$stm2->execute(array($id));
$db_conn->commit();
}
catch(PDOException $e){
$db_conn->rollBack();
}
我想知道的是,我可以在if
和beginTransaction()
之间的代码中使用commit()
语句吗?像这样:
$id = $_GET['id'];
$value = $_GET['val'];
// database connection here
try{
$db_conn->beginTransaction();
// inserting
$stm1 = $db_conn->prepare("INSERT into table1 (col) VALUES (?)");
$stm1->execute(array($value));
// updating
if (/* a condition here */){
$stm2 = $db_conn->prepare("UPDATE table2 SET col = "a new row inserted" WHERE id = ?");
$stm2->execute(array($id));
}
$db_conn->commit();
}
catch(PDOException $e){
$db_conn->rollBack();
}
可以吗?
其实我问过这个问题,因为here是一句话,说你做不到,这样做很危险:
由于您可以使用嵌套的commit()过早关闭事务,因此无法工作并且很危险。
答案 0 :(得分:2)
您的交易结构没有问题。对php.net的评论仅表示MySQL不支持嵌套事务。为了您的进一步问题,您可以查询任何数据(SQL),操纵数据(DML),但不修改任何数据库结构(DDL - 数据定义语言)。
/*won't work*/
START TRANSACTION;
/*statement*/
START TRANSACTION; /*nested not supported, auto commit*/
/*statement*/
COMMIT;
/*statement dependend on 1st transaction won't work*/
COMMIT;
无法嵌套交易。这是当您发出START TRANSACTION语句或其中一个同义词时对任何当前事务执行的隐式提交的结果。
答案 1 :(得分:1)
您可以在事务中执行所有操作,唯一不能做的就是嵌套事务。
if
子句本身不是链接评论中的问题,但事实上内部还有另一个beginTransaction
/ commit
对。