dur*_*ara 5 php postgresql transactions autocommit
我在项目中使用pg_connect和pg_query.但我真的不确定是否使用AutoCommit模式的pg_connect?
这是一个重要的问题,因为我需要在事务下编写一些块,如果服务器忽略其中一个语句,那么数据库就会不一致......
还有一个有趣的问题,pg_query执行后提交?
例如:
pg_query('begin; update table1...; update table2...; commit');
Run Code Online (Sandbox Code Playgroud)
和...一样
pg_query('begin;');
pg_query('update table1...;');
pg_query('update table2...;');
pg_query('commit');
Run Code Online (Sandbox Code Playgroud)
而且是
pg_query('begin; update table1...; update table2...; commit');
Run Code Online (Sandbox Code Playgroud)
在AutoCommit模式下工作,所以开始和提交仍然是?
谢谢你的帮助:dd
首先,PostgreSQL中没有AutoCommit模式,PHP API的pg_*函数不会尝试模拟一个.
pg_query的文档说
当多个语句传递给函数时,它们将自动作为一个事务执行,除非查询字符串中包含显式的BEGIN/COMMIT命令
因此,它保证pg_query("UPDATE1 ..; UPDATE2...")在一个事务中执行并对数据产生全或无影响.
序列
pg_query("BEGIN");
pg_query("UPDATE1...");
pg_query("UPDATE2..");
pg_query("COMMIT");
Run Code Online (Sandbox Code Playgroud)
相当于pg_query("UPDATE1 ..; UPDATE2...")数据完整性(半成品状态不可能发生).
至于注释"除非有明确的BEGIN/COMMIT ...",只有当它们不在整个SQL语句链的开头和结尾时才有意义.也就是说,pg_query("BEGIN; update1; update2; COMMIT;");等同于pg_query("update1; update2;")(显然)不等同于pg_query("update1; COMMIT; update2;")
| 归档时间: |
|
| 查看次数: |
3109 次 |
| 最近记录: |