sql-server-2005 - 将选择语句包含在事务中有什么意义?

标签 sql-server-2005 tsql transactions

将选择语句包含在事务中有什么意义?我认为select语句只是数据库中的“GET”数据,它们没有回滚某些内容的机会,因为您无法更改数据。那么,这是否表示我们不需要在事务中放入选择语句?我对吗?

谢谢。

最佳答案

您是对的:在标准isolation levelread committed处,您不需要在事务中包装选择语句。无论您是否将Select语句包装在事务中,都将防止它们受到脏读取。

connection 1:                          connection 2:

                                       begin transaction
                                       update user set name = 'Bill' where id = 1
select name from users where id = 1
                                       rollback transaction

select语句将不会读取回滚的更新:它们没有包装在事务中没关系。

如果需要repeatable reads,则将选择内容包装在默认事务中无济于事:
connection 1:                          connection 2:

begin transaction
select name from users where id = 1
                                       update user set name = 'Bill' where id = 1
select name from users where id = 1
commit transaction
begincommit语句在这里无济于事:第二个select 可以读取旧名称,或者可以读取新名称。

但是,如果您以更高的隔离级别(例如serializablerepeatable read)运行,则该组将受到保护,无法进行不可重复的读取:
connection 1:                          connection 2:

set transaction isolation level
    repeatable read
begin transaction
select name from users where id = 1
                                       update user set name = 'Bill' where id = 1
select name from users where id = 1              |
commit transaction                               |
                                                 |--> executed here

在这种情况下,update将阻塞,直到第一个事务完成。

很少使用较高的隔离级别,因为它们会减少同时可以在数据库中工作的人数。在最高级别serializable上,报告查询会暂停所有更新 Activity 。

关于sql-server-2005 - 将选择语句包含在事务中有什么意义?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3098644/

相关文章:

sql-server - 使用 SQL 选择单个 xml 节点

sql-server-2005 - sp_executesql 或 exec(@var) 太长。最大长度为 8000

c# - 使用 View ,抽象实际表,使用 View 更新多个表

c# - 有没有办法测试一个潜在的僵尸交易,看看它是否可以回滚?

jpa - 为什么 LocalXAResourceImpl.commit() 中的异常仅给出警告?

sql - 插入或更新时的 T SQL 循环

sql-server-2005 - SQL Server,null 区分大小写吗?

tsql - 如何检查变量是否已经声明(T-SQL)?

sql - 谜题 : Spreading numbers evenly in groups

sql - 嵌套事务无法回滚