HTML5技术

探讨SQL Server并发处理存在就更新七种解决方案 - Jeffcky(2)

字号+ 作者:H5之家 来源:H5之家 2017-06-01 17:00 我要评论( )

) TestPro; TestPro ( @Id INT ) (( 100 )) ( i INT ); ; Test OUTPUT DELETED.Id Id = @Id ; ( SELECT i FROM @updated ) INSERT INTO Test( Id, Name, counter ) VALUES ( @Id , @Name , 1 ); COMMIT GO 经过多次

) TestPro; TestPro ( @Id INT ) ((100)) ( i INT ); ; Test OUTPUT DELETED.Id Id = @Id; ( SELECT i FROM @updated ) INSERT INTO Test ( Id, Name, counter ) VALUES ( @Id, @Name, 1 ); COMMIT GO

 

经过多次认证也是零错误,貌似通过表变量形式实现可行。

解决方案七(提升隔离级别+Merge)

通过Merge关键来实现存在即更新否则则插入,同时我们应该注意设置隔离级别为 SERIALIZABLE  否则会出现插入重复键问题,代码如下:

) TestPro; TestPro ( @Id INT ) ((100)) MERGE Test USING ( Id ) AS source .Id .MATCHED ) VALUES ( @Id, @Name, 1 ); COMMIT GO

多次认证无论是并发100个线程还是并发200个线程依然没有异常信息。

总结

本节我们详细讨论了在并发中如何处理存在即更新,否则即插入问题的解决方案,目前来讲以上三种方案可行。

解决方案一(最高隔离级别 + 更新锁)

) TestPro; TestPro ( @Id INT ) ((100)) BEGIN TRANSACTION; UPDATE dbo.Test WITH ( UPDLOCK, HOLDLOCK ) Id = @Id; ) BEGIN INSERT dbo.Test ( Id, Name, ) VALUES ( @Id, @Name, 1 );

解决方案二(最高隔离级别 + 表变量)

) TestPro; TestPro ( @Id INT ) ((100)) ( i INT ); ; Test OUTPUT DELETED.id id = @id; ( SELECT i FROM @updated ) INSERT INTO Test ( Id, Name, counter ) VALUES ( @Id, @Name, 1 ); COMMIT GO

解决方案三(最高隔离级别 + Merge)

) TestPro; TestPro ( @Id INT ) ((100)) MERGE Test USING ( Id ) AS source .Id .MATCHED ) VALUES ( @Id, @Name, 1 ); COMMIT GO

暂时只能想到这三种解决方案,个人比较推荐方案一和方案三, 请问您有何高见,请留下您的评论若可行,我将进行后续补充。

 

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

相关文章
  • 使用sqlserver搭建高可用双机热备的Quartz集群部署【附源码】 - 一线码农

    使用sqlserver搭建高可用双机热备的Quartz集群部署【附源码】 - 一线

    2017-05-29 13:01

  • HTML5支持服务器发送事件(Server-Sent Events)-单向消息传递数据推送(C#示例) - 熊仔其人

    HTML5支持服务器发送事件(Server-Sent Events)-单向消息传递数据推送

    2017-05-19 11:02

  • ASP.NET Core:部署项目到Ubuntu Server - 王杰光

    ASP.NET Core:部署项目到Ubuntu Server - 王杰光

    2017-05-07 18:01

  • EntityFramework Core并发深挖详解,一纸长文,你准备好看完了吗? - Jeffcky

    EntityFramework Core并发深挖详解,一纸长文,你准备好看完了吗? -

    2017-04-05 14:03

网友点评
>