Php 关于交易行为的两个快速问题
我有如下代码:Php 关于交易行为的两个快速问题,php,database,transactions,Php,Database,Transactions,我有如下代码: function foobar(array& $objects, $con = null) { if (is_null($con)) $con = DbSingleton::getConnectio(); $con->beginTransaction(); // <- question 1 try { foreach($objects as $object) { // allocat
function foobar(array& $objects, $con = null)
{
if (is_null($con))
$con = DbSingleton::getConnectio();
$con->beginTransaction(); // <- question 1
try
{
foreach($objects as $object)
{
// allocate memory for new object
$new_obj = new MyShiningNewObject();
// do something to the new object ...
$new_obj->setParentId($object->getId());
$new_obj->save($con);
// mark for garbage collection
unset($new_obj); // <- question 2
}
$con->commit();
}
catch(Exception $e){ $con->rollBack(); }
}
函数foobar(数组&$objects,$con=null)
{
如果(为空($con))
$con=DbSingleton::getConnectio();
$con->beginTransaction();//setParentId($object->getId());
$new_obj->save($con);
//垃圾收集标志
unset($new_obj);//commit();
}
catch(异常$e){$con->rollBack();}
}
我的问题是:
回答问题2:
- 一旦查询被发送到数据库,对PHP变量所做的事情就不再重要了
- 只有当您
或提交
时,才会产生影响回滚
- 这意味着取消设置PHP变量不会影响数据库端的事务/数据
关于问题1:
- 如果您的数据库系统支持嵌套事务,那么在逻辑上,对“内部”事务的提交/回滚应该只对该“内部”事务起作用
- 但请注意,并非所有DBMS都支持嵌套事务——例如,据我记忆所及,MySQL不支持嵌套事务
- 作为参考,这里有三个关于嵌套引用的问题(可能还有更多问题):
保存点。您可以回滚到以前的每个保存点(通过提供它们的名称),但在没有保存点的情况下发出COMMIT
或rollback
始终提交或回滚最外层的事务