SQL Server 互斥试探是一种有效的数据库事务控制技术,可以确保在同一时间,每一条记录都只有一个客户端可以访问。它的实现原理是通过尝试将一个特殊的“标识符”加载到每一条记录时,如果该标识符已经被加载,那么服务器就拒绝执行命令。这实际上就模拟出了一个互斥锁,防止了在同一时间同一条记录被多个客户端访问。
然而,互斥试探并不是没有局限性。最显著的一个局限性是当特殊“标识符”在试探的时候被多线程加载的情况,这时,服务器就无法分辨,使客户端无法保证互斥性。
为了解决这个问题,我们可以使用atomi_test_and_set 函数及 SQL Server _interlock 内置函数。这两个函数都可以对指定的变量产生原子级的读取和设置操作,这样就能有效的建立互斥从而保证客户端的互斥性。
以下是一个使用 atomi_test_and_set函数 实现SQL Server互斥试探的示例:
DECLARE @val INT
— 尝试把 @val 设置为-1
SET @val = atomic_test_and_set(-1);
— 如果@val 不等于-1,说明其它客户端已经访问此记录了
IF(@val!=-1)
BEGIN
RAISERROR (‘The record is already accessed by other clients’, 16, 1);
END
ELSE
BEGIN
— 访问资源,这里可以放置你的代码……
— 完成任务后,客户端直接解除@val 的锁
SET @val = atomic_test_and_set(0);
END
以下是使用 _ interlock 内置函数实现SQL Server互斥试探的示例:
DECLARE @val INT
— 获取变量 @val 的值
SET @val = _Interlock(3, 0);
— 如果 @val 的值不等于0,说明其它客户端已经访问此记录
IF(@val!=0)
BEGIN
RAISERROR (‘The record is already accessed by other clients’, 16, 1);
END
ELSE
BEGIN
— 访问资源,这里可以放置你的代码……
— 完成任务后,客户端直接解除@val 的锁
SET @val = _Interlock(1, 0);
END
从上面的示例可以看出,使用atomi_test_and_set / _interlock 函数来实现SQL Server互斥试探的实现原理,大大简化了对记录的互斥访问,因此,可以有效的防止记录被多个客户端访问,并确保了数据的完整性。
香港服务器选创新互联,2H2G首月10元开通。
创新互联(www.cdcxhl.com)互联网服务提供商,拥有超过10年的服务器租用、服务器托管、云服务器、虚拟主机、网站系统开发经验。专业提供云主机、虚拟主机、域名注册、VPS主机、云服务器、香港云服务器、免备案服务器等。
新闻名称:SQLServer互斥试探:当竟然不能实现的时候(sqlserver互斥)
文章源于:http://www.shufengxianlan.com/qtweb/news17/456367.html
网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等
声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联