我有一個隨機問題。如果我要做一個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. 查詢性能差異pl/sql插入和純SQL插入
- 3. SQL Server 2014:插入值和子查詢
- 4. 插入SQL連接查詢
- 5. SQL插入查詢需要
- 6. 插入 - SQL Server查詢
- 7. SQL Server插入查詢
- 8. Android sql插入查詢
- 9. SQL嵌套插入查詢
- 10. 插入,更新SQL查詢
- 11. Sql插入查詢性能
- 12. SQL查詢錯誤插入
- 13. 插入查詢
- 14. 從SQL Server解析插入查詢
- 15. 問題與插入到SQL查詢
- 16. 選擇插入SQL Server子查詢
- 17. 插入SQL查詢未成功執行
- 18. 在sql查詢中插入php代碼
- 19. SQL Server查詢 - 插入問題
- 20. SQL Server插入查詢幫助
- 21. SQL子查詢插入錯誤
- 22. 插入查詢C#的SQL Server
- 23. 選擇並插入一個查詢SQL
- 24. SQL查詢來插入列從行
- 25. SQL插入查詢(語法問題)
- 26. SQL插入查詢執行兩次
- 27. SQL插入子查詢的錯誤
- 28. SQL datable查詢插入多個列值
- 29. SQL服務器插入查詢
- 30. 條件單個SQL查詢插入