我理解乐观和悲观锁定*之间的区别.现在有人可以向我解释我何时会使用其中任何一个?
这个问题的答案是否会根据我是否使用存储过程来执行查询而改变?
*但只是为了检查,乐观的意思是"在阅读时不要锁定桌子",悲观意味着"在阅读时锁定桌面".
我有一个在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
我正在编写一个Web应用程序,例如,两个不同的用户可以更新列表中的事情列表.我已经意识到,乐观锁定机制最有效,因为我不期望高争用.
我在看事务隔离级别,现在我有点困惑.看起来不同的事务隔离级别也解决了类似的问题.
这两个不同的概念如何相互关联?如果可能,举个简单的例子.
database concurrency optimistic-locking isolation-level pessimistic-locking
从我最近的一些测试和阅读中看来,似乎XLOCK的"X"(独家)名称部分具有误导性.它实际上不会锁定UPDLOCK.如果它是独占的,它将阻止外部SELECT,但它不会.
我无法从阅读或测试中看到两者之间的区别.
XLOCK创建独占锁的唯一时间是与TABLOCK一起使用时.我的第一个问题是"为什么只有这种粒度?"
此外,我遇到了一个博客,其中说明了以下内容:
但请注意XLOCK提示.SQL Server将有效地忽略XLOCK提示!SQL Server检查自最早的打开事务以来数据是否已更改,这是一种优化.如果不是,则忽略xlock.这使得xlock提示基本上没用,应该避免.
有人遇到过这种现象吗?
根据我所看到的情况,似乎应该忽略这一提示.
我正在尝试为在不同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) 我已经阅读了关于JPA并发性的这篇文章,但要么我太厚,要么不够明确.
我期待做一个数据库控制的原子更新-if-found-else-insert操作(一UPSERT).
它看起来我可怜的慢脑,我可以 - 在一个事务中 - 运行一个锁定模式的命名查询PESSIMISTIC_WRITE,看它是否返回任何结果,然后是a persist()或update()之后.
我不清楚的是使用PESSIMISTIC_WRITE锁和PESSIMISTIC_READ锁进行此操作之间的区别.我已经阅读了句子 - 我明白这PESSIMISTIC_READ是为了防止不可重复的读取,并且PESSIMISTIC_WRITE......好吧,也许我不太了解那个:-) - 但它下面只是一个SQL SELECT FOR UPDATE,是的?在这两种情况下?
我正在试图弄清楚如何正确使用/测试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
我正在尝试 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代码时,你是如何做到的?假设我使用Oracle和Java,我在JDBC中有任何方法可以帮助我做到这一点吗?我该如何配置这个东西?任何指针将不胜感激.
我想明确提供一个关于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)