• SQL使用行锁


    行锁使用需要注意

    1、ROWLOCK行级锁确保在用户取得被更新的行,到该行进行更新,这段时间内不被其它用户所修改。因而行级锁即可保证数据的一致性,又能提高数据操作的并发性。

    2、ROWLOCK告诉SQL Server只使用行级锁,ROWLOCK语法可以使用在SELECT,UPDATE和DELETE语句中。

    3、ROWLOCK指定通常采用页锁或表锁时,采用行锁。 在从 SNAPSHOT 隔离级别操作的事务中指定时,除非将 ROWLOCK 与需要锁的其他表提示(例如,UPDLOCK 和 HOLDLOCK)组合,否则不会取得行锁。

    4、UPDLOCK指定采用更新锁并保持到事务完成。UPDLOCK 仅对行级别或页级别的读操作采用更新锁。 如果将 UPDLOCK 与 TABLOCK 组合使用或出于一些其他原因采用表级锁,将采用排他 (X) 锁。指定 UPDLOCK 时,忽略 READCOMMITTED 和 READCOMMITTEDLOCK 隔离级别提示。 例如,如果将会话的隔离级别设置为 SERIALIZABLE 且查询指定 (UPDLOCK, READCOMMITTED),则忽略 READCOMMITTED 提示且使用 SERIALIZABLE 隔离级别运行事务。

    5、HOLDLOCK等同于SERIALIZABLE。HOLDLOCK 仅应用于那些为其指定了 HOLDLOCK 的表或视图,并且仅在使用了 HOLDLOCK 的语句定义的事务的持续时间内应用。 HOLDLOCK 不能被用于包含 FOR BROWSE 选项的 SELECT 语句。

    第一步:在当前会话中锁定数据行。

    --声明数据库引用
    use test;
    go

    --声明数据库行锁
    begin tran tran1
    select * from MPHead with(rowlock,updlock) where id=1;
    waitfor delay '00:00:10';
    commit tran;
    go

    第二步:开启新会话,进行更新锁定数据行。

    update MPHead set EditBy='demo1' where id=1;

    示例结果:事务延迟提交十秒,在事务未提交之前进行更新会发生进程阻塞,更新是失败的,事务提交完成后行锁被释放更新才能成功。

  • 相关阅读:
    Invalid bound statement (not found): com.**.demo.mapper.User_infoMapper
    IDEA 常用快捷键
    springboot 将项目打包成jar包
    .netcore A circular dependency was detected for the service of type '****'.
    C# 枚举 高级战术
    C#高性能动态获取对象属性值
    使用github actions检测网站是否在线
    纸壳CMS分布式部署集群解决方案
    System.Data.DataRow[] 如何转换为 DataTable
    JavaDoc生成文档
  • 原文地址:https://www.cnblogs.com/wolfocme110/p/14727133.html
Copyright © 2020-2023  润新知