当前位置: 首页 > 面试题库 >

TABLOCKX与可序列化

山煜祺
2023-03-14
问题内容

我有一系列需要自动运行的T-SQL查询。(请参阅下文)…目的是允许1个用户一次检索一个唯一的行,并防止其他用户同时检索同一行。

到目前为止,我已经看到了两种可能的解决方案。1)表提示(HOLDLOCK,TABLOCKX)和2)事务隔离级别(SERIALIZABLE)…

我的问题:

  1. 哪个选项更好?

  2. 还有其他更好的解决方案吗?

    DECLARE @recordId int;

    SELECT @recordId = MIN([id])
    FROM Exceptions
    WHERE [status] = ‘READY’;

    UPDATE Exceptions
    SET [status] = ‘PROCESSING’,
    [username] = @Username
    WHERE [id] = @recordId;

    SELECT * FROM Exceptions
    WHERE [id] = @recordId;


问题答案:

在这种情况下,

  • HOLDLOCK = SERIALIZABLE =持续时间,并发
  • TABLOCKX =专用表锁

这两个概念是不同的,您想要的也不是。

若要执行所需的操作,以避免出现竞争情况,您需要强制使用非阻塞(READPAST)排他(UPDLOCK)行级(ROWLOCK)锁。您还可以使用OUTPUT子句将其设为单个原子语句。这样可以很好地扩展。

UPDATE
    E
SET
   [status] = 'PROCESSING', [username] = @Username
OUTPUT
   INSERTED.*
FROM
   (
    SELECT TOP 1 id, [status], [username]
    FROM Exceptions (ROWLOCK, READPAST, UPDLOCK)
    WHERE [status] = 'READY'
    ORDER BY id
   ) E

一般来说,锁有3个方面

  • 粒度=锁定的内容=行,页,表(PAGLOCK, ROWLOCK, TABLOCK
  • 隔离级别=锁定持续时间,并发(HOLDLOCK, READCOMMITTED, REPEATABLEREAD, SERIALIZABLE
  • 模式=共享/排他性(UPDLOCK, XLOCK

  • “结合”,例如 NOLOCK, TABLOCKX


 类似资料:
  • FAQs in section [36]: [36.1]“序列化”是什么东东? [36.2] 如何选择最好的序列化技术? [36.3] 如何决定是要序列化为可读的(“文本”)还是不可读的(“二进制”)格式? or non-human-readable ("binary") format?") [36.4] 如何序列化/反序列化数字,字符,字符串等简单类型? [36.5] 如何读/写简单类型为可读的

  • 上一小节我们学习了 Java 的输入输出流,有了这些前置知识点,我们就可以学习 Java 的序列化了。本小节将介绍什么是序列化、什么是反序列化、序列化有什么作用,Serializable 接口以及 Externalizable 接口,常用序列化工具介绍等内容。 1. 序列化与反序列化 序列化在计算机科学的数据处理中,是指将数据结构或对象状态转换成可取用格式,以留待后续在相同或另一台计算机环境中,能

  • 问题内容: HashMap实现了Serializable接口;因此可以序列化。我已经看过HashMap的实现,Entry []表被标记为瞬态。由于Entry []表是存储Map的全部内容的表,如果无法序列​​化,则在反序列化期间如何构造Map 问题答案: 如果您查看源代码,将会看到它不依赖默认的序列化机制,而是手动写出所有条目(作为键和值的交替流): 这比数组要紧凑,数组可以包含许多空条目,链接链

  • 问题内容: 我在android / java中对Location的子类进行序列化遇到了麻烦 位置不可序列化。我有一个名为FALocation的第一个子类,它没有任何实例变量。我已经宣布它可序列化。 然后,我有一个名为Waypoint的第二个类,看起来像这样: 序列化工作正常。 反序列化会产生跟随翼异常(腿对象包含一个航路点): 问题答案: 序列化位置绝对必要吗?也许您可以将其标记为瞬态,并在反序列

  • 我试图序列化和反序列化类的列表(vb),显然里面只有派生类的实例。 我用修饰了list参数,获得如下输出: 但是当我反序列化它时,我一直说他不能反序列化抽象类。 http://james.newtonking.com/json/help/index.html?topic=html/SerializeTypeNameHandling.htm 删除注释行它可以工作!

  • 本文向大家介绍什么是序列化与反序列化?相关面试题,主要包含被问及什么是序列化与反序列化?时的应答技巧和注意事项,需要的朋友参考一下 序列化:将对象状态转换为可保持或传输的格式的过程。将对象实例的字段及类的名称转换成字节流,然后把字节流写入数据流 反序列化:将流转换为对象。 这两个过程结合起来,可以轻松地存储和传输数据。