2010-09-22 95 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命中该行之前,并且您得到添加的结果。