sql-server-2005 – 在事务中包含select语句的意义是什么?

在事务中包含select语句的意义是什么?我认为select语句只是从数据库的“GET”数据,他们没有机会回滚的东西,因为你只是不能更改数据。那么,这说我们从不需要在事务中使用select select语句?我对吗?

谢谢。

你是对的:在标准isolation level,读提交,你不需要在事务中包装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

begin和commit语句在这里不会有帮助:第二个选择可能读取旧的名称,或者它可能读取新的名称。

但是,如果您运行在更高的隔离级别,如可序列化或可重复读取,该组将受到保护,不受不可重复读取:

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

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

较高的隔离级别很少使用,因为它们减少了可以在数据库中同时工作的人数。在最高级别,可序列化,报告查询停止任何更新活动。

http://stackoverflow.com/questions/3098644/whats-the-point-to-enclose-select-statements-in-a-transaction

本站文章除注明转载外,均为本站原创或编译
转载请明显位置注明出处:sql-server-2005 – 在事务中包含select语句的意义是什么?