Php Oracle具有锁定行的多个查询

Php Oracle具有锁定行的多个查询,php,oracle,symfony,oracle11g,Php,Oracle,Symfony,Oracle11g,我使用的是ORACLE版本11g 我希望“同时”执行三个查询,并注意如果其中一个或多个查询失败,则必须将两个表返回到前一个状态。这些查询是一个select以了解所选行是否仍然可以执行该操作,以及一个update和一个insert以执行该操作 在我的情况下,我需要对同一锁定行进行更新(显然,其他任何人都不能对同一行执行该操作),然后在另一个表上插入,前提是select查询的结果确认所选行仍然具有执行该操作的选项,因此查询大致如下: //this is the row I want to execu

我使用的是ORACLE版本11g

我希望“同时”执行三个查询,并注意如果其中一个或多个查询失败,则必须将两个表返回到前一个状态。这些查询是一个select以了解所选行是否仍然可以执行该操作,以及一个update和一个insert以执行该操作

在我的情况下,我需要对同一锁定行进行更新(显然,其他任何人都不能对同一行执行该操作),然后在另一个表上插入,前提是select查询的结果确认所选行仍然具有执行该操作的选项,因此查询大致如下:

//this is the row I want to execute the action

$selectedIdFromTable1 = "1";

$query="SELECT attr1 FROM table1 WHERE attr1 = 'oldValueAttr1' AND id = selectedIdFromTable1";
$stmt = $this->oracleDB->prepare($query);
$stmt->bindValue(1, $attr1, "string");
$stmt->execute();
$result = $stmt->fetchColumn();

if($result->num_rows == 1){ //I'm still being able to do the action to the row because the row still having the oldValue
//So here the row must be locked to execute the update and the insert only once. Only one user should execute the update and the insert.

    $query="UPDATE table1 SET attr1 = ? WHERE id == $selectedIdFromTable1";
    $stmt = $this->oracleDB->prepare($query);
    $stmt->bindValue(1, 'newValueAttr1', "string");
    $stmt->execute();

    $query="INSERT INTO table2 (attr2) VALUES (?)";
    $stmt = $this->oracleDB->prepare($query);
    $stmt->bindValue(1, 'newValueAttr2', "string");
    $stmt->execute();

}
//here the lock can release the row for future actions (but not this one, because if any one tries the previous select should not find anymore the selected row)
我还使用绑定系统来发送变量,使其更安全。不确定是否会影响答案

我非常肯定,带锁定行的事务就是答案,如果是答案,我将非常感谢您的帮助,以Oracle事务为例,以这种情况为例

所有这些都将在Symfony 3.3项目中。最后一条信息可能不需要,但事务代码必须位于symfony项目中,而不是oracle数据库中,原因各不相同


非常感谢。

如果您要使用symfony,您很可能会使用DBAL连接。 事务处理如中所述

(对我来说,它更像是一个事务功能,而不是一个锁定功能)

交易:

$conn->beginTransaction();
try{
    // do stuff
    $conn->commit();
} catch (\Exception $e) {
    $conn->rollBack();
    throw $e;
}

锁定不是由DBAL处理的

@OldProgrammer对不起,您能像上次一样给我一个答案吗?在我的项目中,我使用了两个数据库。我处理的MySQL抛出了ORM,很高兴知道我可以用ORM锁定,但是。。。另一个数据库是Oracle 11g,我使用Symfony的DBAL选项管理这个数据库。。。(不能与Entitys Sry一起使用…我可以在Oracle中使用普通查询,因为公司希望这样),因此我需要使用Oracle语言和DBAL连接来完成。所以你的答案对任何人都有帮助,但对我来说,我想没有…@RicardEspinásllove没问题,这也是一个DBAL功能,请参阅我的更新答案So。。。“锁定不是由DBAL处理的”->如果不是由DBAL处理的,我想我可以通过oracle的查询来处理锁定点?对不起,我不知道oracle中的锁定机制