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,Implicit或Explicit之一.
AutoCommit是SQL Server数据库引擎的默认事务管理模式...每个Transact-SQL语句在完成时都会提交或回滚....如果语句成功完成,则提交; 如果它遇到任何错误,它将被回滚.这是默认值,是评论中@ Alex的问题的答案.
在隐式事务模式下,"... SQL Server数据库引擎在提交或回滚当前事务后自动启动新事务.您无需描述事务的开始;您只提交或回滚每个事务.事务模式生成一个连续的事务链...."请注意,斜体代码片段适用于每个事务,无论是单个还是多个语句事务.
当您使用Statement 显式启动事务时,引擎将处于显式事务模式BEGIN TRANSACTION.然后,每个语句都在该事务中执行,直到您显式终止事务(带COMMIT或ROLLBACK)或者如果发生导致引擎终止和回滚的故障.
是的,有一点不同.对于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的事务(提交,开始或回滚)并再次从该会话检查时,该表将显示为空.
| 归档时间: |
|
| 查看次数: |
21011 次 |
| 最近记录: |