将选择语句包含在事务中有什么意义?我认为select语句只是数据库中的“GET”数据,它们没有回滚某些内容的机会,因为您无法更改数据。那么,这是否表示我们不需要在事务中放入选择语句?我对吗?
谢谢。
最佳答案
您是对的:在标准isolation level,read 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
begin
和commit
语句在这里无济于事:第二个select
可以读取旧名称,或者可以读取新名称。但是,如果您以更高的隔离级别(例如
serializable
或repeatable 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/