如何使用高级数据表提示计划

仪器仪表2021年09月06日

我先前的SQL Server专栏中介绍了两种类型的数据表提示(table hints):NOLOCK和READPAST。

这篇文章将探讨在SQL Server中查询的时候,使用其它三种类型的数据表提示的优点和缺点,这三种类型分别是:READCOMMITTED、REPEATABLEREAD和SERIALIZABLE。

下面我们将通过一些实际的操作来了解数据表提示,我将创建一个表,并在这个表中插入一些数据。创建表和插入数据的代码都在Listing A中。

READCOMMITTED

使用SQL Server数据库表默认的行为是locking。当读取数据的时候,这个隔离类型使用共享锁,以便确保只有在数据被提交到数据库之后才能读取。使用这些锁是因为当对数据更新的时候需要排它性的锁,这种锁可以阻挡那些试图使用共享锁的所有读者。

对于绝大部分查询,这个分离层次能够很好的平衡数据库的一致性和同时性;然而,它也是有缺点的,它的缺点就是不可重读(Non-Repeatable read)和幻读(phantom read)。

下面就是使用READCOMMITTED的一个例子。在这个例子中,你需要有查询窗口或者数据库连接到Session 1和Session 2.

Session1:

BEGIN TRANSACTION

UPDATE SalesHistory

SET SalePrice = SalePrice + 1

WHERE SaleID = 201

Session2:

BEGIN TRANSACTION

SELECT * FROM SalesHistory WITH(READCOMMITTED)

这个查询大约返回表的前200条记录。(它可能不会准确的返回200条记录,那是因为第一个会话可能使用page锁,这种锁会把数据的某页锁住,而不是锁住单条记录。)一旦第一个200或者大约这么多条记录被返回了,查询将继续运行,但是不会返回另外的行了。

这个查询会等待,直到从第一个更新语句开始就被锁住的事务释放掉它的锁。我能看到第一个200或者大约这么多条记录的数据。注意,我创建的那个事务一直是打开的。

Session1:

UPDATE SalesHistory

SET SalePrice = SalePrice + 2

WHERE SaleID = 1

COMMIT TRANSACTION

这个更新语句一直等待最初的事务范围。我用SaleID=1来更新记录,这样在Session 2中的事务将返回一行记录。一旦我提交了这个事务,Session 2的查询操作就完成了。

Session2:

SELECT * FROM SalesHistory WITH(READCOMMITTED)

官方公布了参展厂商的初步名单: COMMIT TRANSACTION

我又一次进行同样的查询。虽然它一直在同一个事务中,但是这时候,当SaleID = 1时SalePrice的返回值就不同了。这就是所谓的不可重读(Non-Repeatable read)。

我在同一事务中操作的数据如果在事务外部被改变了的话,可能会对后面的事务产生不利影响。这就是这种事务隔离水平的两个可能的副作用中的一个——另外一个类型是“幻影”读(phantom read)。(我将在REPEATABLEREAD部分详细的介绍幻读。)

沈阳妇科哪家医院好
经常心悸失眠是怎么回事
唐山不孕不育治疗费用多少钱
相关阅读
巴黎男装周——Y/Project服装品牌时装秀

新华网截图,外代,2022年6年末23日 6年末22日,模特在法国巴黎男装周上展示...

2024-12-27
从9988元跌至3469元,折叠台和+骁龙865+2K台和,售价终于亲民了

接合光iPad是现阶段最低端的智能iPad,也是局限性机体台变得低廉的低端机体...

2024-09-08
你们都喜欢网红楼梯!我太太踩的坑你们可要避开!最后有整个楼梯的清单,给你们参考!网红楼梯 魅族lip

你们都羡慕网红升降机!我老公踩的坑你们可要避开!之前有整个升降机的清...

2024-07-24
抱骨灰盒出来香奈儿,真的不会挨揍吗?

因为众所周知的理由,去年的米兰淑女周暂停协办一年,本年就让尽办法迎来...

2024-06-24
通威股份(600438.SH)2022-2024年员工持股计划已完成投资者购买 斥资约54.88

通威持股(600438.SH)发布日前,截至本日前披露日,新公司2022-2024年员工持股计...

2024-06-16
华杰专硕第四届大湾区MBA名校大联展在深圳圆满举办!

六年初夏日炎炎,MBA应考们也在热火朝天地取用里!2023高等院校MBA入学措施...

2024-06-08
友情链接