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

Mysql 数据库事务是否防止其他用户干扰它,mysql,sql,database,transactions,Mysql,Sql,Database,Transactions,假设我是这样做的(注意:下面的语法可能不正确,但不用担心……它只是为了说明问题) 因此,select的目标是从上一个insert刚刚插入的表中获取所有信息,并且仅通过上一个insert 现在假设在执行过程中,在执行INSERT之后,其他用户也执行id=100的INSERT 事务的下一步中的SELECT语句是否也会获取由其他用户执行的INSERT插入的行,还是只获取由事务中的前一个INSERT插入的两行 顺便说一句,我使用的是MySQL,因此请将您的答案定制为MySQL。该事务将使事务中的语句在运

假设我是这样做的(注意:下面的语法可能不正确,但不用担心……它只是为了说明问题)

因此,select的目标是从上一个insert刚刚插入的表中获取所有信息,并且仅通过上一个insert

现在假设在执行过程中,在执行INSERT之后,其他用户也执行id=100的INSERT

事务的下一步中的SELECT语句是否也会获取由其他用户执行的INSERT插入的行,还是只获取由事务中的前一个INSERT插入的两行


顺便说一句,我使用的是MySQL,因此请将您的答案定制为MySQL。该事务将使事务中的语句在运行时不会受到其他事务的任何干扰。大多数DBMS(包括MySQL)维护事务的属性。在您的情况下,您对原子的A感兴趣,这意味着DBMS将使事务中的所有语句看起来都是原子运行的,不会中断。

当其他用户更新同一行时,将应用行级锁。所以他只有在你的交易结束后才能做出改变。因此,您将看到插入的结果集。希望这能有所帮助。

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

但是,它稍微复杂一些,因为行锁定可以是读锁或写锁

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

对于SQL数据库事务来说,Interfere是一个模糊的词。事务可以看到的行在一定程度上取决于它的属性

因此,select的目标是从该表中获取所有信息 刚刚被前一个插入项插入,并且仅被前一个插入项插入 插入

前面的插入也有点模糊

您可能应该在尝试阅读之前提交有问题的插入内容。否则,在某些不受您控制的情况下,该事务可能会回滚,并且id=100的行可能实际上不存在


当然,在提交后,其他事务可以自由更改“id”的值、“value”的值,或者同时更改这两个值。(也就是说,如果他们有足够的权限。)

出于效率原因,开发人员不会将事务设置为彼此完全隔离。
数据库支持多个级别,即可序列化、可重复读取、已提交读取和未提交读取。它们是从最严格到最不严格的列表。

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

第420页描述了由隔离级别处理的三种事务条件

  • 脏读是一个事务读取另一个事务未提交的更改。假设事务T1修改了一行。如果事务T2读取该行并看到修改,即使T1没有提交修改,这也是脏读。这是一个问题的一个原因是,如果T1回滚,更改将撤消,但T2不知道这一点
  • 当事务执行相同的检索两次,但每次都得到不同的结果时,就会发生不可重复的读取。假设T1读取一些行,然后T2更改其中一些行并提交更改。如果T1在再次读取行时看到更改,则会得到不同的结果;初始读取是不可重复的。这是一个问题,因为T1不能从同一个查询中获得一致的结果
  • 幻影是显示在以前不可见的位置的行。假设T1和T2开始,T1读取一些行。如果T2插入一个新的行,而T1在再次读取时看到该行,则该行是一个幻影
第421页描述了四(4)个事务隔离级别:

  • :允许事务查看其他事务所做的未提交更改。此隔离级别允许脏读、不可重复读和幻影发生
  • :仅当其他事务已提交时,允许事务查看其他事务所做的更改。未提交的更改仍然不可见。此隔离级别允许发生不可重复的读取和幻影
  • (默认):确保是事务问题,同一选择两次,无论其他事务提交或未提交的变更,它都会得到相同的结果。换句话说,它从同一查询的不同执行中获得一致的结果。在一些数据库系统中,可重复读取隔离级别允许幻影,这样,如果另一个事务在SELECT语句之间的inerbal中插入新行,第二个SELECT将看到它们。对于InnoDB来说,情况并非如此;可重复读取级别不会出现幻影
  • :完全隔离一项交易与其他交易的影响。它类似于可重复读取,但有一个附加限制,即在第一个事务完成之前,一个事务选择的行不能被另一个事务更改
可以在全局、会话内或特定事务中为DB会话设置隔离级别:

SET GLOBAL TRANSACTION ISOLATION LEVEL isolation_level;
SET SESSION TRANSACTION ISOLATION LEVEL isolation_level;
SET TRANSACTION ISOLATION LEVEL isolation_level;
其中,隔离等级为以下值之一:

  • “读取未提交”
  • “读取已提交”
  • “可重复读取”
  • 'SERIALIZABLE'
my.cnf
中,您还可以设置默认值:

[mysqld]
transaction-isolation = READ-COMMITTED
[mysqld]
transaction-isolation = READ-COMMITTED