事务与pdo php相结合,同时支持多个客户端

piztneat  于 2021-06-21  发布在  Mysql
关注(0)|答案(1)|浏览(251)

我有一个问题:我有一个php应用程序,它的用户每5分钟写一个表单。表单保存在4到5个数据表中。在保存信息的那一刻,我必须同时将其保存在每个数据表中,以避免重复,并保留结构。因此,我使用事务使每个不同的insert sql语句成为可能。此外,我使用事务来进行回滚,无论是否必要。此外,我在一个动态函数中使用了与php中的pdo相结合的事务:

public static function ejecutarQueryTransactionPDO($vaStrSQL,$vaValues,$vaTypesValues){
$stmt = null;
$conn = null;

try {
  $conn = Datos2PDO::createConnectionPDO();

  $conn->setAttribute(PDO::ATTR_EMULATE_PREPARES , PDO::CASE_NATURAL);

  $stmt = null;

  $conn->beginTransaction();

  for ($j=0, $m = count($vaStrSQL); $j < $m; $j++) {
    $stmt = $conn->prepare($vaStrSQL[$j]);

    for ($i=0, $n = count($vaValues[$j]); $i < $n; $i++) {
      if ($vaTypesValues[$j][$i] != 'd') {
        $stmt->bindParam($i+1, $vaValues[$j][$i], Datos2PDO::$aTiposParametrosPDO[$vaTypesValues[$j][$i]]);
      } else {
        $stmt->bindParam($i+1, intval($vaValues[$j][$i]), Datos2PDO::$aTiposParametrosPDO[$vaTypesValues[$j][$i]]);
      }
    }

    $stmt->execute();
  }

  $conn->commit();
} catch (Exception $e) {
  file_put_contents("../../".DaoParameters::CARPETA_ERRORES."/notrs_logs_error.txt", date('Y-m-d H:i:s')." ".$_SESSION["NOTRS_userName"]." datos2PDO ejecutarQueryTransactionPDO ".$e->getMessage()."\n", FILE_APPEND | LOCK_EX);
  if (isset ($conn)) {
    $conn->rollback();
  }
  $stmt = null;
  $conn = null;
  return false;
}

//close connection
$stmt = null;
$conn = null;

return true;
}

所以,我的问题是:使用多个存储过程而不是事务更好吗?事务是否会以不好的方式影响性能?事务中的表锁是否会以不好的方式影响性能?你能给我一些关于如何提高性能和速度的建议吗?

6ljaweal

6ljaweal1#

交易是件好事。没有事务,就有数据完整性丢失的风险。你不希望数据库中有坏数据。交易也会受到惩罚。但是,事务的好处(即确保数据完整性)大于惩罚。
确保您的交易不会太长或持久。如果查询总是相同的,但参数值不同,只需准备一次查询,然后执行多次。这将减少在循环中多次准备查询的成本。你在你的例子中所做的看起来很好。

相关问题