Php 使用“选择”在提交前检查事务中的条件
在一个相当大的事务中,如果发生异常,必须执行roolback以避免数据库中的不一致性,我将执行两个操作,包括选择、更新和插入 在下面的简化示例中,我希望在保留“第一次操作”部分的同时,取消“第二次操作”部分中某些条件的插入 我的问题是DBAL和PostGreSQL都不支持嵌套事务,因此我无法单独部分回滚“第二个操作” 我想知道如何处理这个问题。 我曾想在遇到$condition时删除插入,但这听起来像是一个讨厌的解决方案 我如何以更干净的方式处理这个问题Php 使用“选择”在提交前检查事务中的条件,php,sql,postgresql,transactions,dbal,Php,Sql,Postgresql,Transactions,Dbal,在一个相当大的事务中,如果发生异常,必须执行roolback以避免数据库中的不一致性,我将执行两个操作,包括选择、更新和插入 在下面的简化示例中,我希望在保留“第一次操作”部分的同时,取消“第二次操作”部分中某些条件的插入 我的问题是DBAL和PostGreSQL都不支持嵌套事务,因此我无法单独部分回滚“第二个操作” 我想知道如何处理这个问题。 我曾想在遇到$condition时删除插入,但这听起来像是一个讨厌的解决方案 我如何以更干净的方式处理这个问题 我认为您可以使用保存点做任何事情:。我
我认为您可以使用保存点做任何事情:。我不认为我可以将保存点与DBAL一起使用。无论如何,我过于简化了我的示例,在实际的系统中,在第二次操作之后,我还有其他操作要做。所以我不能直接回滚到保存点。那太容易了…:-)@Nitseg:DBAL可能不包括对保存点的支持,但希望它不会阻止您发出自己的
SAVEPOINT
命令。回滚到保存点不会结束事务,因此您可以在之后开始第三个操作。@尼克:好的,谢谢您的建议。我将使用DBAL来尝试这一点。也许这是可能的。@Craig:这可能是一个选项,但我需要做一些相对复杂的处理,出于一致性的原因,我更喜欢在应用程序端进行处理。我想你可以用保存点做你想做的事情:。我不认为我可以将保存点与DBAL一起使用。无论如何,我过于简化了我的示例,在实际的系统中,在第二次操作之后,我还有其他操作要做。所以我不能直接回滚到保存点。那太容易了…:-)@Nitseg:DBAL可能不包括对保存点的支持,但希望它不会阻止您发出自己的SAVEPOINT
命令。回滚到保存点不会结束事务,因此您可以在之后开始第三个操作。@尼克:好的,谢谢您的建议。我将使用DBAL来尝试这一点。也许这是可能的。@Craig:这可能是一个选项,但我需要做一些相对复杂的处理,出于一致性的原因,我更喜欢在应用程序端进行处理。我想你可以用保存点做你想做的事情:。我不认为我可以将保存点与DBAL一起使用。无论如何,我过于简化了我的示例,在实际的系统中,在第二次操作之后,我还有其他操作要做。所以我不能直接回滚到保存点。那太容易了…:-)@Nitseg:DBAL可能不包括对保存点的支持,但希望它不会阻止您发出自己的SAVEPOINT
命令。回滚到保存点不会结束事务,因此您可以在之后开始第三个操作。@尼克:好的,谢谢您的建议。我将使用DBAL来尝试这一点。也许这是可能的。@Craig:这可能是一个选项,但我需要做一些相对复杂的处理,出于一致性的原因,我更喜欢在应用程序端进行处理。
$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;
}