2010-09-22 96 views
2

我有一個隨機問題。如果我要做一個sql選擇,而sql服務器查詢我的請求時,別人會做一個插入語句......那麼在那個插入語句中輸入的數據是否也可以從我的select語句中檢索?sql查詢和插入

回答

2

查詢是排隊的,所以如果在INSERT之前發生SELECT,就不可能看到新插入的數據。

使用默認隔離級別,SELECT通常被賦予比其他更高的特權,但仍然只讀取COMMITTED數據。因此,如果在SELECT發生時INSERT數據還沒有被提交 - 再一次,你不會看到新插入的數據。如果INSERT已提交,則後續的SELECT將包含新插入的數據。

如果隔離級別允許讀取UNCOMMITTED(AKA dirty)數據,那麼是 - 在INSERT之後但在提交INSERT數據之前發生的SELECT將返回該數據。這不是建議的做法,因爲UNCOMMITTED數據可能會受到ROLLBACK的影響。

2

如果SELECT語句在INSERT語句之前執行,則所選數據肯定不會包含新插入的數據。

使用默認引擎MyISAM在MySQL中發生的情況是,所有INSERT語句都需要表鎖;因此,一旦執行了INSERT語句,它將首先等待所有現有的SELECT完成,然後再鎖定表,執行INSERT並將其解鎖。

欲瞭解更多信息,請參見:Internal Locking Methods in the MySQL manual

1

不,那已經執行了INSERT的時刻永遠不會聚集在SELECT語句開始執行不存在的新記錄的選擇。

另外,如果您使用事務性存儲引擎InnoDB,則可以確保您的SELECT不包含當前正在插入的行。這就是交易隔離ACID中的「I」的目的。

有關更多詳細信息,請參閱http://dev.mysql.com/doc/refman/5.1/en/set-transaction.html,因爲關於讀提交和讀取未提交事務隔離模式存在一些細微差別。

1

我不知道MySQL的詳細信息,但在SQL Server中,它將取決於是否有任何使用的鎖定提示以及鎖的默認行爲。你有兩個選擇:

  • SELECT鎖表,這意味着INSERT不會處理,直到你的選擇就完成了。
  • SELECT能夠做一個「髒讀」,這意味着如果你稍微出的最新數據事務不關心,你錯過了INSERT
  • SELECT是能夠做到「髒讀取「,但INSERT發生在SELECT命中該行之前,並且您得到添加的結果。