PHP 和 PostgreSQL 事务?

tft*_*ftd 2 php sql database postgresql

很久以前,我写了一个处理 postgresql 数据库连接的 php 类。
我已将事务添加到我的插入/更新函数中,它对我来说工作得很好。但最近我发现了“pg_prepare”函数。
我对这个函数的作用有点困惑,以及切换到它是否会更好。

目前,每当我执行插入/更新时,我的 sql 都会如下所示:

$transactionSql = "PREPARE TRANSACTION ".md5(time()).";"
                  .$theUpdateOrDeleteSQL.";".
                  ."COMMIT;";

This will return something like:
PREPARE TRANSACTION '4601a2e4b4aa2632167d3cc62b516e6d';
INSERT INTO users (username,g_id,email,password)
            VALUES('test',  '1', 'test','1234');
COMMIT;
Run Code Online (Sandbox Code Playgroud)

我已经用关系构建了我的数据库,并且正在使用(如果可能的话):

 ON DELETE CASCADE
 ON UPDATE CASCADE
Run Code Online (Sandbox Code Playgroud)

但我希望 100% 确定数据库中的内容是干净的,并且如果/当更新/删除或插入失败时没有残留。

如果您能分享您对 pg_prepare 的意见/经验,那就太好了,我真的需要“准备交易”以及任何其他可能对我有帮助的附加内容吗?:)

peu*_*feu 5

不,你不需要两阶段提交!...

为了安全的 PHP 数据库处理,不要直接使用 pg_query,而是将其包装在一个特殊的函数中,该函数执行以下操作:

  • 在您的第一个查询上打开数据库连接
  • 如果使用持久连接,请确保连接处于已知状态
  • 将_shutdown_function注册到发出ROLLBACK的函数
  • 确保自动提交已关闭,或者只需在第一个查询之前发出 BEGIN
  • 记录数据库错误和缓慢的查询
  • 只使用 pg_query_params() 来很好地处理 sql 注入

这样,如果您的脚本崩溃或发生其他情况,则会自动发出回滚。您只能通过显式提交来提交。

如果您使用持久连接,请注意:php 对 pg_pconnect 的处理有点......错误。