簡單示例(偽代碼):
for (int i = 0; i < 100; i ) {
START TRANSACTION;
SELECT id, name FROM employees WHERE id = i;
IF (someFunction(id)) {
ROLLBACK;
CONTINUE; // GO TO NEXT EXECUTION OF FOR LOOP
}
UPDATE company SET good = good 1;
COMMIT;
}
我可以在這個例子中使用 COMMIT(所以我的腳本中有兩個 COMMIT)而不是 ROLLBACK?
如果我在選擇后使用 COMMIT 而不是 ROLLBACK 對資料庫有什么影響嗎?
這里 MySQL 和 PostgreSQL 有什么區別嗎?
uj5u.com熱心網友回復:
Select本身不需要回滾或提交。只有在 DML(插入、更新、洗掉)之后才需要這些。此外,通常認為事務中只有 1 次提交更好。整個交易完全成功或完全作為一個單元的想法。所以你的偽代碼變成:
START TRANSACTION;
for (int i = 0; i < 100; i ) {
SELECT id, name FROM employees WHERE id = i;
IF NOT (someFunction(id)) {
UPDATE company SET good = good 1;
}
}
COMMIT;
uj5u.com熱心網友回復:
因此,我理解您的問題是詢問 ROLLBACK 或 COMMIT 是否更好,僅在選擇之后,您確定不會在此事務中進行任何更改。
就 mysql 而言,沒有理由進行回滾或提交;由于沒有進行任何更改,因此也沒有任何更改,并且不執行任何操作都不會導致任何問題。但是不清楚您希望首先在事務中使用 select 來完成什么。
uj5u.com熱心網友回復:
這是@Belayer 答案的變體,我在其中進行了以下更改:
- 執行單個
SELECT,目的是減少查詢次數 - 保持運行總數
company.good應該增加的次數,最后用單個UPDATE.
new_good = 0;
SELECT id, name FROM employees WHERE id >= 0 AND i < 100
for each fetched row {
IF NOT (someFunction(id)) {
new_good ;
}
}
START TRANSACTION /* Probably not needed */
UPDATE company SET good = good new_good;
COMMIT /* Probably not needed */;
這可能完全消除了對事務的需要,因為對SELECT或 fetch 的任何失敗呼叫都不會導致對 的更改new_good,因此當它最終到達 時UPDATE,new_good仍將包含有效值(即使為 0)。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/336028.html
標籤:mysql sql PostgreSQL
上一篇:無法使用外部應用決議XML
下一篇:在SQL查詢中添加新列
