在事务中的select语句和在它之外的select语句之间是否存在差异

Omu*_*Omu 38 sql sql-server select transactions

默认的READ COMMITTED隔离级别是否以某种方式使select语句在事务内部的行为与不在事务中的行为不同?

我正在使用MSSQL.

Cha*_*ana 63

是的,事务中的一个可以看到该事务中其他先前的Insert/Update/delete语句所做的更改,事务外的Select语句不能....

如果您要询问的是隔离级别的作用,那么请理解 - 所有选择语句(嘿,所有类型的语句), - 在一个事务中.在事务中明确表示的事件与站在事务上的事件之间的唯一区别在于,独立的事务在执行事务之前立即启动它的事务,并在执行后立即提交或回滚,

而事务中显式的那个可以(因为它有一个Begin Transaction语句)可以在该Select语句之前或之后的同一事务中发生其他语句(插入/更新/删除,无论如何).

因此,无论隔离级别如何设置,选择(显式事务内部或外部)都将处于以该隔离级别运行的事务中.

增加:以下内容适用于SQL Server,但所有数据库必须以相同的方式工作.在SQL Server中,查询处理器始终处于3种事务模式,AutoCommit,ImplicitExplicit之一.

AutoCommit是SQL Server数据库引擎的默认事务管理模式...每个Transact-SQL语句在完成时都会提交或回滚....如果语句成功完成,则提交; 如果它遇到任何错误,它将被回滚.这是默认值,是评论中@ Alex的问题的答案.

隐式事务模式下,"... SQL Server数据库引擎在提交或回滚当前事务后自动启动新事务.您无需描述事务的开始;您只提交或回滚每个事务.事务模式生成一个连续的事务链...."请注意,斜体代码片段适用于每个事务,无论是单个还是多个语句事务.

当您使用Statement 显式启动事务时,引擎将处于显式事务模式BEGIN TRANSACTION.然后,每个语句都在该事务中执行,直到您显式终止事务(带COMMITROLLBACK)或者如果发生导致引擎终止和回滚的故障.


Jef*_*and 7

是的,有一点不同.对于MySQL,在第一次查询之前,数据库实际上并不是以快照开头.因此,重要的不是开始,而是交易中的第一个陈述.如果我执行以下操作:

#Session 1
begin; select * from table;

#Session 2
delete * from table; #implicit autocommit

#Session 1
select * from table;
Run Code Online (Sandbox Code Playgroud)

然后我会在会话一中得到相同的东西(我删除它之前在表中的信息).当我结束会话1的事务(提交,开始或回滚)并再次从该会话检查时,该表将显示为空.