假设我这样做(请注意:下面的语法可能不正确,但不要担心......它只是在那里提出要点)
Start Transaction
INSERT INTO table (id, data) VALUES (100,20), (100,30);
SELECT * FROM table WHERE id = 100;
End Transaction
因此,select的目标是从前一个插入插入的表中获取所有信息,并且仅通过前面的INSERT ...
现在假设在执行期间,INSERT执行后,其他一些用户也执行了一个id = 100的INSERT ...
事务的下一步中的SELECT语句是否也会获得其他用户执行的INSERT插入的行,或者只是获取事务中前面的INSERT插入的两行?
顺便说一下,我正在使用MySQL,所以请定制你对MySQL的答案
答案 0 :(得分:6)
这完全取决于数据库连接使用的事务隔离。
根据MySQL 5.0 Certification Study Guide
页面420描述了隔离级别处理的三个事务条件
页面421描述了四(4)个事务隔离级别:
可以在全局,会话内或特定事务中为您的数据库会话设置隔离级别:
SET GLOBAL TRANSACTION ISOLATION LEVEL isolation_level;
SET SESSION TRANSACTION ISOLATION LEVEL isolation_level;
SET TRANSACTION ISOLATION LEVEL isolation_level;
其中isolation_level是以下值之一:
'READ UNCOMMITTED'
'READ COMMITTED'
'REPEATABLE READ'
'SERIALIZABLE'
在my.cnf
中,您也可以设置默认值:
[mysqld]
transaction-isolation = READ-COMMITTED
答案 1 :(得分:2)
当其他用户正在更新同一行时,将应用行级锁定。因此,只有在您的交易结束后,他才能进行更改。因此,您将看到插入的结果集。希望这会有所帮助。
答案 2 :(得分:2)
干扰是一个模糊的词。事务可以看到哪些行部分由其isolation level确定。
因此,select的目标是从表中获取所有信息 刚被前面的插入插入,只有前面插入 INSERT ...
前置插入也有点模糊。
否则,在您控制下的某些条件 not 下,该事务可能会回滚,而id = 100的行可能实际上不存在。
当然,在提交之后,其他交易可以自由更改“id”,“value”或两者的值。 (如果他们有足够的权限,那就是。)
答案 3 :(得分:0)
交易将使交易中的报表看起来像是在没有任何其他交易干扰的情况下运行。大多数DBMS(包括MySQL)都为事务维护ACID属性。在您的情况下,您对A for Atomic感兴趣,这意味着DBMS将使您的事务中的所有语句看起来像原子地运行而不会中断。
答案 4 :(得分:0)
答案 5 :(得分:0)
出于效率原因,开发人员不会将事务设置为彼此完全隔离。 数据库支持多个isolation级别,即Serializable,Repeatable reads,Read committed和Read uncommitted。它们是从最严格到最不严格的列表。