标签: pessimistic-locking

乐观与悲观锁定

我理解乐观和悲观锁定*之间的区别.现在有人可以向我解释我何时会使用其中任何一个?

这个问题的答案是否会根据我是否使用存储过程来执行查询而改变?

*但只是为了检查,乐观的意思是"在阅读时不要锁定桌子",悲观意味着"在阅读时锁定桌面".

sql-server locking optimistic-locking pessimistic-locking

510
推荐指数
12
解决办法
29万
查看次数

行被另一个事务更新或删除(或未保存的值映射不正确)

我有一个在Web服务器上运行的java项目.我总是遇到这个例外.

我阅读了一些文档,发现悲观锁定(或乐观,但我认为悲观更好)是防止此异常的最佳方法.

但我找不到任何解释如何使用它的明确例子.

我的方法是这样的:

@Transactional
Public void test(Email email, String Subject){
   getEmailById(String id);
   email.setSubject(Subject);
   updateEmail(email);
}
Run Code Online (Sandbox Code Playgroud)

而:

  • Email 是一个hibernate类(它将是数据库中的一个表)
  • getEmailById(String id)是一个返回的函数email(此方法未注释@Transctional)
  • updateEmail(email):是一种更新电子邮件的方法.

注:我使用Hibernate进行保存,更新和等(例如:session.getcurrentSession.save(email))

例外:

ERROR 2011-12-21 15:29:24,910 Could not synchronize database state with session [myScheduler-1]
org.hibernate.StaleObjectStateException: Row was updated or deleted by another transaction (or unsaved-value mapping was incorrect): [email#21]
    at org.hibernate.persister.entity.AbstractEntityPersister.check(AbstractEntityPersister.java:1792)
    at org.hibernate.persister.entity.AbstractEntityPersister.update(AbstractEntityPersister.java:2435)
    at org.hibernate.persister.entity.AbstractEntityPersister.updateOrInsert(AbstractEntityPersister.java:2335)
    at org.hibernate.persister.entity.AbstractEntityPersister.update(AbstractEntityPersister.java:2635)
    at org.hibernate.action.EntityUpdateAction.execute(EntityUpdateAction.java:115)
    at org.hibernate.engine.ActionQueue.execute(ActionQueue.java:279)
    at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:263)
    at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:168)
    at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:321)
    at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:50)
    at …
Run Code Online (Sandbox Code Playgroud)

java spring hibernate amazon-web-services pessimistic-locking

57
推荐指数
5
解决办法
20万
查看次数

锁定机制(悲观/乐观)与数据库事务隔离级别有何关系?

我正在编写一个Web应用程序,例如,两个不同的用户可以更新列表中的事情列表.我已经意识到,乐观锁定机制最有效,因为我不期望高争用.

我在看事务隔离级别,现在我有点困惑.看起来不同的事务隔离级别也解决了类似的问题.

这两个不同的概念如何相互关联?如果可能,举个简单的例子.

database concurrency optimistic-locking isolation-level pessimistic-locking

18
推荐指数
1
解决办法
3888
查看次数

SQL Server,误导性的XLOCK和优化

从我最近的一些测试和阅读中看来,似乎XLOCK的"X"(独家)名称部分具有误导性.它实际上不会锁定UPDLOCK.如果它是独占的,它将阻止外部SELECT,但它不会.

我无法从阅读或测试中看到两者之间的区别.

XLOCK创建独占锁的唯一时间是与TABLOCK一起使用时.我的第一个问题是"为什么只有这种粒度?"

此外,我遇到了一个博客,其中说明了以下内容:

但请注意XLOCK提示.SQL Server将有效地忽略XLOCK提示!SQL Server检查自最早的打开事务以来数据是否已更改,这是一种优化.如果不是,则忽略xlock.这使得xlock提示基本上没用,应该避免.

有人遇到过这种现象吗?

根据我所看到的情况,似乎应该忽略这一提示.

sql-server locking sql-server-2008 pessimistic-locking

17
推荐指数
1
解决办法
2万
查看次数

为什么我对使用Oracle的JPA中的悲观锁定无法正常工作

我正在尝试为在不同JBoss节点中运行的cron作业实现某种信号量.我正在尝试使用数据库(Oracle 11g)作为锁定机制,使用一个表来同步不同节点中的cron作业.表非常简单:

CREATE TABLE SYNCHRONIZED_CRON_JOB_TASK
(
   ID            NUMBER(10)           NOT NULL,
   CRONJOBTYPE   VARCHAR2(255 Byte),
   CREATIONDATE  TIMESTAMP(6)         NOT NULL,
   RUNNING       NUMBER(1)
);

ALTER TABLE SYNCHRONIZED_CRON_JOB_TASK
   ADD CONSTRAINT PK_SYNCHRONIZED_CRON_JOB_TASK
   PRIMARY KEY (ID); 
Run Code Online (Sandbox Code Playgroud)

因此,当作业启动时,它会在表中搜索其cronjobtype的条目,并检查它是否已在运行.如果不是,则将条目设置运行标志更新为true.第一个选择是使用JPA CriteriaApi使用Hibernate和Pessimistic Lock进行的.

query.setLockMode(javax.persistence.LockModeType.PESSIMISTIC_WRITE);
Run Code Online (Sandbox Code Playgroud)

所有这些操作都是在一次交易中完成的.

当一个进程运行时,它所做的查询如下:

[Server:server-two] 10:38:00,049 INFO  [stdout] (scheduler-2) 2015-04-30 10:38:00,048 WARN  (Loader.java:264) - HHH000444: Encountered request for locking however dialect reports that database prefers locking be done in a separate select (follow-on locking); results will be locked after initial query executes
[Server:server-two] 10:38:00,049 INFO  [stdout] (scheduler-2) Hibernate: select …
Run Code Online (Sandbox Code Playgroud)

java oracle hibernate jpa pessimistic-locking

12
推荐指数
1
解决办法
5387
查看次数

LockModeType.PESSIMISTIC_WRITE是否足以支持JPA中的UPSERT?

我已经阅读了关于JPA并发性的这篇文章,但要么我太厚,要么不够明确.

我期待做一个数据库控制的原子更新-if-found-else-insert操作(一UPSERT).

看起来我可怜的慢脑,我可以 - 在一个事务中 - 运行一个锁定模式的命名查询PESSIMISTIC_WRITE,看它是否返回任何结果,然后是a persist()update()之后.

我不清楚的是使用PESSIMISTIC_WRITE锁和PESSIMISTIC_READ锁进行此操作之间的区别.我已经阅读了句子 - 我明白这PESSIMISTIC_READ是为了防止不可重复的读取,并且PESSIMISTIC_WRITE......好吧,也许我不太了解那个:-) - 但它下面只是一个SQL SELECT FOR UPDATE,是的?在这两种情况下?

concurrency jpa upsert pessimistic-locking

8
推荐指数
1
解决办法
5655
查看次数

Laravel lockforupdate(悲观锁定)

我正在试图弄清楚如何正确使用/测试lockforupdate,但我发现它的功能不像我的预期

这只是测试

public function index() {
        return dd(\DB::transaction(function() {
            if (\Auth::guard('user')->check()) {
                $model = \App\Models\User::find(1)->lockForUpdate();
                sleep(60);
                $model->point = 100000;
                $model->save();
            } else {
                $model = \App\Models\User::find(1);
                $model->point = 999;
                $model->save();
            }

            return $model;
        }));
}
Run Code Online (Sandbox Code Playgroud)

我尝试在2个浏览器中测试,浏览器1用户登录,浏览器2未登录,浏览器1点击刷新,然后锁定更新并在更新前60秒睡眠

在60秒内,我去浏览器2并点击刷新,但记录未锁定,我检查phpmyadmin并更新记录(在浏览器1的60秒锁定触发器内)

但是在60秒之后,浏览器1再次修改了记录(点100000)

所以我误解了lockforupdate用于?或者我测试不正确?

我期望的是在前60秒内浏览器2不应该修改行(带有加载图标的空白页或错误抛出?)

https://laravel.com/docs/5.2/queries#pessimistic-locking

我做了一些研究,但仍然无法理解sharedLock(LOCK IN SHARE MODE)和lockForUpdate(FOR UPDATE)之间的区别

顺便说一句,我确认数据库是innodb

php mysql pessimistic-locking laravel laravel-5

8
推荐指数
2
解决办法
1万
查看次数

如何使用 JPA 获取 PessimisticLockException

我正在尝试 JPA 对数据库锁定的支持,以避免记录中的并发请求。在我的场景中,我需要使用悲观锁。我使用以下方法得到了这一点:

EntityManager em;
...

Map<String,Object> props = new HashMap<String,Object>();
props.put("javax.persistence.lock.timeout", 0);
em.find(MyEntity.class, id, LockModeType.PESSIMISTIC_READ, props)
Run Code Online (Sandbox Code Playgroud)

但通过这种方法,我处理 aLockTimeoutException而不是 a PessimisticLockException具体如何处理PessimisticLockException

java jpa locking pessimistic-locking jpa-2.0

8
推荐指数
1
解决办法
1万
查看次数

如何从java代码中编写乐观和悲观锁定代码

我知道乐观和悲观锁定是什么,但是当你编写java代码时,你是如何做到的?假设我使用Oracle和Java,我在JDBC中有任何方法可以帮助我做到这一点吗?我该如何配置这个东西?任何指针将不胜感激.

java database jdbc optimistic-locking pessimistic-locking

7
推荐指数
2
解决办法
1万
查看次数

通过明确排序避免死锁

我想明确提供一个关于MySql InnoDB如何获取行锁的命令.如果可能的话,不应该有任何死锁只是停滞.(如果我们遵循惯例.)

首先,数据库应按升序锁定表"模型"中的所有行.然后第二个表"颜色"中的所有行应按升序锁定.有没有办法控制数据库首先锁定表"模型"然后"颜色"?

举个例子:

start transaction;
select *
from models m
join colors c on c.model_id = m.id
where c.id IN (101, 105, 106)
order by m.id asc, c.id asc
for update;
Run Code Online (Sandbox Code Playgroud)

mysql sql innodb locking pessimistic-locking

7
推荐指数
1
解决办法
524
查看次数