我的代码如下:
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(); }
}
我的问题是:
我开始一个交易,这很可能是一个嵌套的交易。在嵌套事务的情况下,如果抛出异常并且我回滚,则回滚到达最远的位置(到最外面的事务) - 常识表明应该是这种情况,但是人们永远不知道。
我正在释放内存(好吧,Zend GC标记为“可用”)。由于我在循环之后提交事务,(变量在循环中被标记为可擦除),这是否安全 - 我的意思是数据是否安全地存储在数据库中,即使我已取消设置值来自的变量?
答案 0 :(得分:2)
由于只有最外层交易的结果可以从外部看到,因此嵌套交易几乎没有意义,只有主要系统只有SQL Server
支持它们。
在SQL Server
中,中间回滚回滚到中间事务的开头,中间提交不执行任何操作。
最外面的回滚回滚整个最外层的事务(即使中间有提交),最外面的提交会提交整个最外层的事务。
其他系统只有一个事务级别,其间可能有SAVEPOINTS
。您可以回滚到以前的每个保存点(通过提供其名称),但是在没有savename点的情况下发出COMMIT
或ROLLBACK
始终会提交或回滚最外面的保存点。
答案 1 :(得分:1)
回答问题2:
commit
或rollback
。
关于问题1: