我有一个随机的问题。如果我要做一个SQL选择,当sql服务器查询我的请求时别人做了一个插入语句...那个插入语句中输入的数据是否也可以从我的select语句中检索出来?
答案 0 :(得分:2)
如果在INSERT语句之前执行SELECT语句,则所选数据肯定不会包含新插入的数据。
MySQL中使用默认引擎MyISAM会发生的事情是所有INSERT语句都需要表锁;因此,一旦执行了INSERT语句,它将首先等待所有现有的SELECT完成,然后再锁定表,执行INSERT,然后将其解锁。
有关详细信息,请参阅:Internal Locking Methods in the MySQL manual
答案 1 :(得分:2)
查询排队,因此如果SELECT在INSERT之前发生,则不可能看到新插入的数据。
使用默认隔离级别,SELECT通常比其他级别具有更高的权限,但仍然只读取COMMITTED数据。因此,如果在SELECT发生时尚未提交INSERT数据 - 再次,您将看不到新插入的数据。如果已提交INSERT,则后续SELECT将包括新插入的数据。
如果隔离级别允许读取UNCOMMITTED(AKA脏)数据,则是 - 在INSERT之后但在INSERT数据提交之前发生的SELECT将返回该数据。这不是建议的做法,因为UNCOMMITTED数据可能会受到ROLLBACK的影响。
答案 2 :(得分:1)
不,一个已经执行的SELECT,INSERT的那一刻永远不会收集SELECT语句开始执行时不存在的新记录。
此外,如果您使用事务存储引擎InnoDB,您可以放心,您的SELECT将不包含当前正在插入的行。这是事务隔离的目的,或ACID中的“I”。
有关更多详细信息,请参阅http://dev.mysql.com/doc/refman/5.1/en/set-transaction.html,因为有一些关于读取提交和读取未提交事务隔离模式的细微差别。
答案 3 :(得分:1)
我不知道MySQL的细节,但在SQL Server中,它将取决于是否使用了任何锁定提示,以及锁的默认行为。你有几个选择:
SELECT
会锁定该表格,这意味着在您的选择完成之前INSERT
将不会处理。SELECT
能够执行“脏读”,这意味着如果您获得稍微过时的数据,交易并不在意,您错过了INSERT
SELECT
能够执行“脏读”,但INSERT
会在SELECT
点击该行之前发生,并且您会获得已添加的结果。答案 4 :(得分:1)
你这样做的唯一方法就是“脏读”。
看看MYSql's documentation on TRANSACTION ISOLATION LEVELS,以便更好地了解它是什么。