我有一個隨機問題。如果我要做一個sql選擇,而sql服務器查詢我的請求時,別人會做一個插入語句......那麼在那個插入語句中輸入的數據是否也可以從我的select語句中檢索?sql查詢和插入
sql查詢和插入
回答
查詢是排隊的,所以如果在INSERT之前發生SELECT,就不可能看到新插入的數據。
使用默認隔離級別,SELECT通常被賦予比其他更高的特權,但仍然只讀取COMMITTED數據。因此,如果在SELECT發生時INSERT數據還沒有被提交 - 再一次,你不會看到新插入的數據。如果INSERT已提交,則後續的SELECT將包含新插入的數據。
如果隔離級別允許讀取UNCOMMITTED(AKA dirty)數據,那麼是 - 在INSERT之後但在提交INSERT數據之前發生的SELECT將返回該數據。這不是建議的做法,因爲UNCOMMITTED數據可能會受到ROLLBACK的影響。
如果SELECT語句在INSERT語句之前執行,則所選數據肯定不會包含新插入的數據。
使用默認引擎MyISAM在MySQL中發生的情況是,所有INSERT語句都需要表鎖;因此,一旦執行了INSERT語句,它將首先等待所有現有的SELECT完成,然後再鎖定表,執行INSERT並將其解鎖。
欲瞭解更多信息,請參見:Internal Locking Methods in the MySQL manual
不,那已經執行了INSERT的時刻永遠不會聚集在SELECT語句開始執行不存在的新記錄的選擇。
另外,如果您使用事務性存儲引擎InnoDB,則可以確保您的SELECT不包含當前正在插入的行。這就是交易隔離或ACID中的「I」的目的。
有關更多詳細信息,請參閱http://dev.mysql.com/doc/refman/5.1/en/set-transaction.html,因爲關於讀提交和讀取未提交事務隔離模式存在一些細微差別。
我不知道MySQL的詳細信息,但在SQL Server中,它將取決於是否有任何使用的鎖定提示以及鎖的默認行爲。你有兩個選擇:
- 你
SELECT
鎖表,這意味着INSERT
不會處理,直到你的選擇就完成了。 - 你
SELECT
能夠做一個「髒讀」,這意味着如果你稍微出的最新數據事務不關心,你錯過了INSERT
- 你
SELECT
是能夠做到「髒讀取「,但INSERT
發生在SELECT
命中該行之前,並且您得到添加的結果。
你這樣做的唯一方法是用「髒讀」。
看看MYSql's documentation on TRANSACTION ISOLATION LEVELS以更好地瞭解它是什麼。
- 1. sql插入查詢
- 2. SQL插入查詢
- 3. SQL插入查詢
- 4. 查詢性能差異pl/sql插入和純SQL插入
- 5. SQL Server 2014:插入值和子查詢
- 6. sql查詢插入與子查詢
- 7. 單個SQL插入查詢
- 8. SQL查詢空值插入
- 9. sql查詢插入auto_incremented值?
- 10. SQL插入WITH SELECT查詢
- 11. 插入,更新SQL查詢
- 12. SQL Server插入查詢
- 13. 嵌套插入SQL查詢
- 14. SQL嵌套插入查詢
- 15. SQL插入查詢需要
- 16. SQL插入查詢出錯
- 17. Sql插入查詢性能
- 18. SQL插入查詢循環
- 19. 插入SQL連接查詢
- 20. 插入 - SQL Server查詢
- 21. 合併插入SQL查詢
- 22. Android sql插入查詢
- 23. 運行插入SQL查詢
- 24. 插入SQL與子查詢
- 25. 插入和選擇查詢
- 26. 插入查詢
- 27. 插入查詢
- 28. 優化sybase SQL查詢插入
- 29. SQL插入選擇選擇查詢
- 30. 插入SQL查詢未成功執行