2017-02-16 63 views
1

使用OCI_NO_AUTO_COMMIT當我試圖汽車時遇到奇怪的行爲觸犯使用oci_*功能提交插入或更新在我的PHP項目。PHP OCI汽車在oci_execute

According to the documentation插入和更新查詢應被腳本結束時,承諾除非oci_commit函數被調用:

使用OCI_NO_AUTO_COMMIT模式開始或繼續交易。事務會在連接關閉或腳本結束時自動回滾。顯式調用oci_commit()來提交事務,或者oci_rollback()來中止它。

插入或更新數據時,建議使用事務處理關係數據一致性和性能方面的原因。

如果OCI_NO_AUTO_COMMIT模式用於包含查詢的任何語句,並且oci_commit()或oci_rollback()未隨後調用,則即使沒有數據更改,OCI8也會在腳本末尾執行回滾。爲避免不必要的回滾,許多腳本不會對查詢或PL/SQL使用OCI_NO_AUTO_COMMIT模式。在同一腳本中使用不同模式使用oci_execute()時,請注意確保應用程序的適當事務一致性。

當我執行與OCI_NO_AUTO_COMMIT一個INSERT查詢作爲oci_execute函數第二個參數,事後調用oci_rollback功能的腳本結束之前,該數據未提交 - 如預期。但是,如果我在腳本結束之前執行相同的過程並且不要調用oci_rollback函數(既不是oci_commit函數),也會提交數據。我錯過了什麼?我誤解了文檔嗎?

以下代碼提交插入,這不是我所期望的。

$sqlString = "INSERT INTO table1 (col1) VALUES ('test')"; 
$stid = oci_parse($dbConnection, $sqlString); 
$r = oci_execute($stid, OCI_NO_AUTO_COMMIT); 

注意:該項目運行PHP7和OCI8。

+0

我不能使用'PHP/7.0.15','OCI8/2.1.3','InstantClient/12.1.0.2.0'(Windows 10上的所有'x64')插入11gR2服務器。只需添加或刪除'OCI_NO_AUTO_COMMIT'參數就會導致記錄的行爲(提交或回滾)發生。 – timclutton

回答

0

檢查您是否執行後續的DDL語句(例如CREATE TABLE),因爲這將觸發數據庫的提交。