我試圖充分理解事務的概念。因此,下面的問題......(當然新手,所以不要笑:D)PHP中的SQL服務器事務
我已經在PHP(使用微軟的PHP SQL驅動程序)中設置(簡化)事務。我想我要刪除一些額外的處理後的行:
sqlsrv_begin_transaction($conn);
$sql = "SELECT * FROM test WITH (XLOCK) WHERE a<10";
$statement = sqlsrv_query($conn,$sql);
$sql = "DELETE FROM test WHERE a<10";
sqlsrv_query($conn,$sql);
$result = get_result_array($statement);
sqlsrv_commit($conn);
$result2 = get_result_array($statement);
1)我得到在$ result中預期的結果,但在$ RESULT2空數組。爲什麼?
我只希望得到$ result2的結果,因爲事實上已經被執行了。我猜想$ result中的結果是內存中的一種「臨時」結果,實際上並不是實際數據庫中的結果。
2)它可能是在事務開始和實際提交之間,來自另一個連接的另一個查詢改變了匹配的行(一個< 10)?這意味着我期望的結果根據$結果將不同於數據庫中的實際更改。或者是(a)事務發生在數據庫的內存中副本上(不受其他連接的內部查詢影響),或(b)自事務開始以來獲得的鎖定是已經爲來自其他連接的其他查詢採取行動?
輸入後,我期待答案b ....?
$ conn'中的連接在提交後仍然打開嗎?如果沒有,也許這就是'$ result2'爲空的原因。 (它試圖使用一個關閉的連接)。 – 2010-01-05 17:00:24