我正在尝试了解 SQL Server 中的隔离/锁。
我在 READ COMMITTED 隔离级别(默认)中有以下场景
我们有一张桌子。
create table Transactions(Tid int,amt int)
with some records
insert into Transactions values(1, 100)
insert into Transactions values(2, -50)
insert into Transactions values(3, 100)
insert into Transactions values(4, -100)
insert into Transactions values(5, 200)
现在从msdn我明白了
当选择被触发时共享锁被采取,所以没有其他事务可以修改数据(避免脏读)。文档还讨论了行级、页级、表级锁。我想到了以下场景
Begin Transaction
select * from Transactions
/*
some buisness logic which takes 5 minutes
*/
Commit
我想了解的是共享锁将被获取的持续时间以及哪个(行、页、表)。
仅当语句时才会获取锁select * from Transactions
是运行还是获取整个 5 分钟以上直到我们到达 COMMIT。
你问错了问题,你担心的是执行细节。您应该考虑和关心的是隔离级别的语义。 Kendra Little 有一张很好的海报来解释它们:免费海报! SQL Server 隔离级别指南 http://www.littlekendra.com/2011/02/08/isoposter/.
你的问题应该改写如下:
从项目中选择 *
问:我会看到哪些项目?
A:所有承诺的项目
问:如果有未提交的事务已插入/删除/更新项目,会发生什么情况?
答:您的 SELECT 将阻塞,直到所有未提交的项目都被提交(或回滚)。
问:如果插入/删除/更新新项目会发生什么while我运行上面的查询?
答:结果尚未确定。您可能会看到一些修改,而不会看到其他一些修改,并且可能会被阻止,直到其中一些修改提交为止。
一旦您的语句完成,READ COMMITTED 就不会做出任何承诺,无论事务的长度如何。如果您再次运行该语句,您将再次拥有与之前状态完全相同的语义,并且您之前看到的项目可能会更改、消失,并且可能会出现新的项目。显然这意味着改变can选择后将被制作到项目中。
更高的隔离级别提供更强的保证:可重复读取保证在提交之前您第一次选择的任何项目都不能被修改或删除。 SERIALIZABLE 添加了保证,即在提交之前,第二个选择中不会出现新项目。
这是你需要了解的,而不是实现机制如何运作。掌握了这些概念后,你可能会问实现细节。它们都在中描述事务处理:概念和技术 https://rads.stackoverflow.com/amzn/click/com/1558601902.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)