每當我插入一些東西時,表格是否被鎖定?因爲我想每秒插入數千行,所以我想知道是否有多個線程可以有效地幫助插入。如果每個插入操作鎖定表,則只有一個線程幾乎與10個線程一樣高效。 如果它依賴於數據庫引擎,我使用SQL Server 2008.什麼時候數據庫表被鎖定?
2
A
回答
4
VoidPointer不一定是正確的。他也不一定是不正確的。這取決於你爲什麼有一個多線程應用程序。如果線程純粹被設計爲一種「插入更多數據」的機制,那麼它就不會提高性能。但是如果線程有其他用途,那麼它表明你的延遲可能是系統中的其他地方,你不應該擔心太多的數據庫。你爲什麼得到所有這些線程?大概你試圖讓其他一些操作更高效 - 比如多個I/O綁定調用,它們以未知的時間間隔完成,但將整體延遲降低到最長運行線程的長度?如果沒有更多關於你想要實現的內容以及爲什麼,你不能簡單地宣稱多線程解決方案是錯誤的。
看一看some of the locking hint options SQL Server supports ..
我認爲 SQL Server支持併發插入
3
鑑於數據庫是'瓶頸',而不是線程正在做的工作,使得來自不同線程的所有插入(使用單獨連接)將不利於你的表現。特別是如果你每次插入一個新的事務。每次提交事務時,數據庫都需要工作以確保數據完整性得到維護。這是非常糟糕的,因爲所有的交易都會競爭對同一個對象進行更改。
而不是使用多個線程插入您應該確保您在一個單一事務中執行所有操作,並且只在所有插入完成時才提交。
BEGIN TRANSACTION;
INSERT INTO myTable (Col1, Col2) 'First' ,1;
INSERT INTO myTable (Col1, Col2) 'Second' ,2;
...
COMMIT;
N.B. - 還可以做所有的刀片在一個stament但這並不有所作爲性能方面:
INSERT INTO myTable (Col1, Col2)
SELECT 'First' ,1
UNION ALL
SELECT 'Second' ,2
UNION ALL
SELECT 'Third' ,3;
在一個事務進行分組我看來多個刀片是要簡單得多。另外,第二個版本可能會產生一個嵌套的語句,對於數據庫來說處理起來太過分了。
相關問題
- 1. SqlServer,事務死鎖,什麼時候表被實際鎖定?
- 2. 什麼時候檢查數據庫是否被鎖定在sqlite中的錯誤
- 3. SQLITE_BUSY數據庫文件被鎖定(數據庫被鎖定)wicket
- 4. 數據庫被鎖定?
- 5. SQLite數據庫被鎖定
- 6. 數據庫被鎖定-sqlite3
- 7. 數據庫被鎖定sqCommand.ExecuteNonQuery()?
- 8. 數據庫被鎖定
- 9. JDBC「數據庫表被鎖定」錯誤
- 10. sqlalchemy數據庫表被鎖定
- 11. 分離SQLite數據庫時出錯 - 數據庫被鎖定
- 12. 試圖在表中插入值時數據庫被鎖定?
- 13. 我們什麼時候使用QMutexLocker重新鎖定和解鎖?
- 14. Winforms數據綁定:需要知道什麼時候我的數據被保存
- 15. 「數據庫文件被鎖定」與System.Data.SQLite
- 16. JDBC SQL數據庫被鎖定?
- 17. sqlite3異常數據庫被鎖定
- 18. 關於數據庫被鎖定
- 19. 新的sqlite3數據庫被鎖定
- 20. SQLite數據庫文件被鎖定
- 21. SQLITE_BUSY數據庫被鎖定java
- 22. 數據庫被鎖定異常
- 23. SQLite正忙,數據庫被鎖定
- 24. 用SQLite和C「數據庫被鎖定」#
- 25. 數據庫被鎖定getReadableDatabase()android
- 26. Python中的SQLite:數據庫被鎖定
- 27. sqlite3.OperationalError:數據庫被鎖定
- 28. Webview SQLiteException:數據庫被鎖定
- 29. 數據庫被鎖定在Django項目
- 30. java「數據庫被鎖定」SQL例外
說得好。除非唯一的目的是加速插入,否則沒有理由認爲多線程在此時不會有幫助。 – 2010-02-01 00:10:23
好點。我以某種方式假定線程完成的工作不是瓶頸。情況很可能如此。 – VoidPointer 2010-02-01 08:00:49