数据库事务是否阻止其他用户干扰它

时间:2012-12-18 17:18:33

标签: mysql sql database transactions

假设我这样做(请注意:下面的语法可能不正确,但不要担心......它只是在那里提出要点)

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的答案

6 个答案:

答案 0 :(得分:6)

这完全取决于数据库连接使用的事务隔离。

根据MySQL 5.0 Certification Study Guide

enter image description here

页面420描述了隔离级别处理的三个事务条件

  • 脏读是一个事务读取另一个未提交的更改。假设事务T1修改了一行。如果事务T2读取行并看到修改,尽管T1还没有提交它,那就是脏读。这是一个问题的一个原因是,如果T1回滚,更改将被撤消,但T2不知道。
  • 当事务执行两次相同的检索但每次获得不同的结果时发生不可重复的读取。假设T1读取某些行,然后T2更改其中一些行并提交更改。如果T1在再次读取行时看到更改,则会得到不同的结果;初始读取是不可重复的。这是一个问题,因为T1不会从同一查询中获得一致的结果。
  • 幻像是出现在之前不可见的行。假设T1和T2开始,T1读取一些行。如果T2插入一个新的,并且T1在再次读取时看到该行,则该行是一个幻像。

页面421描述了四(4)个事务隔离级别:

  • READ-UNCOMMITTED:允许事务查看其他事务所做的未提交的更改。此隔离级别允许进行脏读,不可重复读取和幻像。
  • READ-COMMITTED:允许事务仅在已提交的情况下才能查看其他事务所做的更改。未提交的更改仍然不可见。这种隔离级别允许不可重复的读取和幻像发生。
  • REPEATABLE READ(默认值):确保该事务发出相同的SELECT两次,无论其他事务所做的已提交或未提交的更改如何,它都会获得相同的结果。换句话说,它从同一查询的不同执行中获得一致的结果。在某些数据库系统中,REPEATABLE READ隔离级别允许幻像,这样如果另一个事务插入新行,则在SELECT语句之间的代理中,第二个SELECT将看到它们。 InnoDB不是这样;重复读取级别不会出现幻像。
  • SERIALIZABLE:完全隔离一个交易与其他交易的影响。它与REPEATABLE READ类似,附加限制是在第一个事务完成之前,一个事务选择的行不能被另一个事务更改。

可以在全局,会话内或特定事务中为您的数据库会话设置隔离级别:

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)

在SQL数据库事务中,

干扰是一个模糊的词。事务可以看到哪些行部分由其isolation level确定。

  

因此,select的目标是从表中获取所有信息   刚被前面的插入插入,只有前面插入   INSERT ...

前置插入也有点模糊。

否则,在您控制下的某些条件 not 下,该事务可能会回滚,而id = 100的行可能实际上不存在。

当然,在提交之后,其他交易可以自由更改“id”,“value”或两者的值。 (如果他们有足够的权限,那就是。)

答案 3 :(得分:0)

交易将使交易中的报表看起来像是在没有任何其他交易干扰的情况下运行。大多数DBMS(包括MySQL)都为事务维护ACID属性。在您的情况下,您对A for Atomic感兴趣,这意味着DBMS将使您的事务中的所有语句看起来像原子地运行而不会中断。

答案 4 :(得分:0)

唯一有效的用户是那些需要访问表中相同行的用户。否则用户不会受到影响。

然而稍微复杂一点,因为行锁定可以是读锁定或写锁定。

以下是InnoDB存储引擎的解释。

答案 5 :(得分:0)

出于效率原因,开发人员不会将事务设置为彼此完全隔离。 数据库支持多个isolation级别,即Serializable,Repeatable reads,Read committed和Read uncommitted。它们是从最严格到最不严格的列表。