在一个非常大的事务中,如果发生异常以避免DB中的不一致,必须进行反转,我正在做一些操作,包括选择,更新和插入。
在下面的简化示例中,我想在“第二个操作”部分的某些条件下取消一些INSERT,同时保留“第一个操作”部分。
我的问题是DBAL和PostGreSQL不支持嵌套事务,因此我无法单独回滚“第二个操作”。
我想知道如何处理这个问题。 当$条件被击中时,我正在考虑删除INSERT,但这听起来像是一个讨厌的解决方案。
我怎样才能更清洁地处理这个问题?
$conn->beginTransaction();
try{
// ==========================
// Do a first operation in DB
// ==========================
$conn->beginTransaction();
try{
// Do an INSERT in DB
$conn->commit();
}
catch(Exception $e)
{
$conn->rollBack();
throw $e;
}
// ===========================
// Do a second operation in DB
// ===========================
$conn->beginTransation();
try{
// Do multiple INSERTs in DB
while( !$exit )
{
// Do one INSERT
// Go to next occurrence OR exit
}
if( $condition )
{
// Here I would like to cancel all the DB INSERTS.
// To ease the operation I would like to use the rollBack function.
// But DBAL is not designed like this. Calling rollback here will rollback
// the outer try also and hence all DB operations inluding the first operation.
// In addition, PostGreSQL doesn't seem to support nested transactions.
$conn->rollBack();
}
else
{
$conn->commit();
}
}
catch(Exception $e)
{
$conn->rollBack();
throw $e;
}
$conn->commit();
}
catch(Exception $e)
{
$conn->rollBack();
throw $e;
}