问题标签 [pessimistic-locking]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
sql-server - 乐观与悲观锁定
我了解乐观锁定和悲观锁定之间的区别。现在有人可以向我解释我什么时候会使用其中任何一个吗?
这个问题的答案是否会根据我是否使用存储过程来执行查询而改变?
但只是为了检查,乐观的意思是“阅读时不要锁定表格”,悲观的意思是“阅读时锁定表格”。
sql-server - select语句上的sql行锁
我有一个 ASP.Net 网页,用户在其中选择一行进行编辑。我想在该行上使用行锁,一旦用户完成编辑和更新,另一个用户可以编辑该行,即如何使用行锁,以便只有一个用户可以编辑一行?
谢谢
hibernate - 悲观锁定不适用于查询 API
我已经编写了上述查询,但是它没有生成for update
查询并且正在同时更新。
我使用的是 3.5.2 版本,它在 Criteria API 中有一个错误,查询 API 中是否也存在相同的错误,或者我做错了什么?
orm - JPA 同步实体访问器
这是设置:实体类具有延迟加载的其他实体的集合。诀窍是,我需要执行一些与数据相关的工作(例如,我想用集合的元素计算某些校验和)。
这里的诀窍是我想不惜一切代价避免竞争条件,例如:“有人在我进行数据计算时更新了实体”。在正常情况下,我只会声明 getter/setter 同步并且会对此感到满意。但据我了解,如果另一个线程决定从数据库更新实体状态,而我正在计算校验和,它将完全忽略“同步”方法(它将直接访问该字段)。
我可能错了强硬。所以问题是:在初始校验和计算时,有没有办法“锁定”对实体部分或整个实体本身的访问?
提前致谢!PS如果您需要代码片段来说明问题 - 请告诉我。到目前为止,我认为这个问题很清楚。
jpa - LockModeType.PESSIMISTIC_WRITE 对于 JPA 中的 UPSERT 是否足够?
我读过这篇关于 JPA concurrency的文章,但要么我太厚,要么不够明确。
我正在寻找一个数据库控制的原子更新-if-found-else-insert 操作(一个UPSERT
)。
在我可怜的慢大脑看来,我可以——当然在一个事务中——运行一个锁定模式为 的命名查询PESSIMISTIC_WRITE
,看看它是否返回任何结果,然后是 apersist()
或 a update()
。
我不清楚的是使用PESSIMISTIC_WRITE
锁与PESSIMISTIC_READ
锁执行此操作之间的区别。我已经阅读了这些句子——我知道这PESSIMISTIC_READ
是为了防止不可重复读取,并且PESSIMISTIC_WRITE
是......好吧,也许我不太理解那个句子:-)——但在它下面只是一个 SQL SELECT FOR UPDATE
,是的? 在这两种情况下?
ado.net - 使用 System.Transactions 的行级更新锁
我有一个 MSSQL 过程,其中包含以下代码:
我正在尝试将相同的行为移动到使用 OleDb 连接、命令和事务以实现相同结果的组件中。(这是一个使用上面显示的 SecurityAssignment 表的安全组件。无论该表是在 MSSQL、Oracle 还是 Db2 中,我都希望它能够工作)
鉴于上述 SQL,如果我使用以下代码运行测试
其中 Subject.GetAssignmentsHavingUser 运行上面的 sql 并返回结果集合,而 backgroundWork 是一个更新表中行的 Action,如下所示:
然后测试返回的foregroundResults 应该反映在backgroundWork 操作中所做的更改。
也就是说,我检索具有由 SQL 应用的 UPDLOCK、ROWLOCK 的 SecurityAssignment 表行列表,并且针对这些行的后续查询在该更新锁被释放之前不会返回 - 因此测试中的 foregroundResult 包括在背景线程。
这一切都很好。
现在,我想对与数据库无关的 SQL 做同样的事情,使用 OleDb 事务和隔离级别来实现相同的结果。我不能为我的生活,弄清楚如何去做。甚至有可能,还是这种行级锁定仅适用于数据库级别?
nhibernate - NHibernate - 悲观锁定不起作用
正如我在上面的问题中描述的那样,我正在尝试为并发问题实施悲观锁定(请随时添加到那个问题中)。但这对我不起作用。
我做了一个非常简单的测试:我运行了两个单独的站点,它们都将计数器增加了 500 倍。我同时运行它们。最后,我希望我的表中的某个列的值是 1000,你猜对了。
这是代码。这当然不是生产代码,但不管是否是测试代码,它应该仍然可以工作,对吧?
该GetById
方法使用 LockMode.Upgrade:
现在,使用 NHProfiler 我看到以下 SQL 语句:
SELECT Id FROM 'User' WHERE Id = 42 for update
但结果是大约530的值,因此这大约是由于并发而丢失的更新的一半。我究竟做错了什么?我在这个测试中禁用了二级缓存。我是否使用了错误的锁定模式?我应该指定隔离级别吗?还要别的吗?提前致谢。
编辑: FluentNhibernate 配置:
sql-server - SQL Server,误导性的 XLOCK 和优化
从我最近所做的一些测试和阅读来看,XLOCK 的“X”(专有)名称部分似乎具有误导性。事实上,它并没有锁定任何比 UPDLOCK 更多的东西。如果它是独占的,它将阻止外部 SELECT,但它不会。
我无法从阅读或测试中看到两者之间的差异。
XLOCK 唯一一次创建排他锁是在与 TABLOCK 一起使用时。我的第一个问题是“为什么只有这种粒度?”
此外,我遇到了一个博客,其中陈述了以下内容:
但是,请注意 XLOCK 提示。SQL Server 将有效地忽略 XLOCK 提示!有一个优化,SQL Server 检查自最旧的打开事务以来数据是否已更改。如果不是,则忽略 xlock。这使得 xlock 提示基本上没有用,应该避免。
有没有人遇到过这种现象?
根据我所看到的,似乎这个提示应该被忽略。
mysql - mysql事务悲观锁损坏
我正在使用休眠、innodb 和 mysql。我在一个非常长的休眠事务开始时获得了一个悲观锁(在特定的表行上)。有时,当我运行启动此事务的程序并在 Eclipse 中以独立应用程序模式运行,并硬停止应用程序(这会强制线程死亡)时,我会遇到以下情况:
MySQL 没有意识到事务已中止。下次我运行我的应用程序时,获得悲观锁(在那个长事务开始时)的函数会阻塞,即使 MySQL 应该意识到该行已解锁。
让事情再次运行的唯一方法是停止 MySQL 守护程序并重新启动它,然后获得悲观锁。
这真的让我很担心。这意味着除异常或完全关闭之外的任何 VM 退出都可能使 MySQL 处于需要重新启动 MySQL 守护程序的损坏状态。一个例子是使用正常的方式关闭和重新启动 Tomcat,在我的理解中涉及线程死亡,就像使用 eclipse 中止正在运行的应用程序一样。
其他人遇到过这个问题吗?有没有一种干净的方法来停止不涉及线程死亡的tomcat?MySQL不应该在获得悲观锁(选择更新)的事务中间免受线程死亡的影响吗?
我正在使用 $CATALINA_HOME/bin/shutdown.sh 停止 tomcat
安迪
entity-framework-4 - 使用实体框架的“下一个数字”场景
我一直在玩 Entity Framework,到目前为止我非常喜欢使用它。但是到目前为止我所做的一切都假设乐观锁定在大多数情况下对我来说很有效。但是,我有以下情况:
- 只有一行包含应用程序范围数据的 SQL Server 表
- 该行包含名为“NextAvailableNumber”的列
- 应用程序需要读取数字,将其增加 1,然后更新它
以上必须保证任何竞争进程都必须等待获得一个数字,直到第一个事务完成。以前我们使用表锁来完成此操作(因为只有一行),但我想知道如何使用 LINQ to Entities 来完成此操作?
谢谢,
吉姆·K。