2015-10-09 75 views
-1

哪一個是首選的提交方式?這兩種方法在內部究竟發生了什麼?數據庫提交:哪個是首選方式,爲什麼?

1:

for item in items: 
     cursor2.execute(query3, [some_parameter]) 
     connection1.commit() 

2:

for item in items: 
     cursor2.execute(query3, [some_parameter]) 
connection1.commit() 

回答

0

據我瞭解connection1.commit()將更改寫入數據庫。

在第一個示例中,您每次都在進行提交,這可能需要更長的時間,但哪個「更安全」(在發生崩潰時,更多的數據已寫入數據庫)。

在第二個示例中,在所有更改完成後,您正在寫入數據庫。由於這只是一次寫入操作,所需的時間會更少,儘管從技術上講它不太「安全」。

在正常的環境中,並簡稱爲循環,我會去第二個。如果您的代碼需要數小時才能運行,那麼第一種方法可能對您更好。

0

假設你的查詢修改數據:

第一種方法意味着數據庫將與每個迭代(項目按項目)所做的更改進行更新。第二種方法意味着只有一次更新,在完成所有項目後,以及所做的所有更改。

與第一種方法的潛在問題可能是:

  • 數據不一致,如果你因爲某些原因沒有完成迭代週期,這是重要的是要有要麼所有的更新或沒有人的;

  • 數據不一致,如果其他人在您更新數據集時查詢該數據集;

  • 擁塞如果您發送太多更新請求(尤其是如果他們每個人都鎖定一個或多個表)。

與第二種方法可能遇到的問題可能是:

  • 由於一次發送太多的數據錯誤;

  • 別人可能已經修改了相同的數據以不同的方式設置,然後輸,因爲你的更新,這是在他們的早期狀態的數據所做的這些更改。根據事務隔離級別,這可能導致數據不一致或您的事務被拒絕。

選擇哪種方法取決於具體的用例。

0

1的方法,

  • 將需要更多的時間,因爲它必須更改提交到由項目數據庫項;
  • 它需要更多的I/O(訪問硬盤驅動器);
  • 如果在第二個查詢中發生錯誤,則第一個查詢已經提交。

因爲它提交更改僅一次2

  • 將執行更快的方法;
  • 它佔用更少的I/O;
  • 如果在第二個查詢中發生錯誤,則回滾第一個查詢;

第二種方法類似於批量插入,因爲它僅在所有查詢執行時才提交所有更改。

相關問題