我有一个随机问题。如果我要做一个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查询插入