我对JPA中LockModeTypes的工作感到困惑:
LockModeType.Optimistic
LockModeType.OPTIMISTIC_FORCE_INCREMENT
LockModeType
?LockModeType.PESSIMISTIC_READ
select for update nowait
(如果未指定提示超时)..Read
锁?LockModeType.PESSIMISTIC_WRITE
select for update nowait
(如果未指定提示超时).LockModeType.PESSIMISTIC_READ
我看到两个触发相同查询的区别是什么?LockModeType.PESSIMISTIC_FORCE_INCREMENT
select for update nowait
(如果没有指定提示超时)并且还增加版本号.for update no wait
?我正在尝试为在不同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) 我正在使用 Spring Framework 和 Spring Data,我需要在处理完成时锁定数据库表中的特定行,因此在处理完成之前没有其他人可以访问数据并更改它。同时,我正在运行同一应用程序的多个实例。
是否会PESSIMISTIC_WRITE
以这样一种方式锁定数据库中的特定行,当一个应用程序实例访问该行时,同一应用程序的其他实例将无法访问该行,这些实例可能同时尝试从数据库访问同一行时间?
有一个问题讨论了锁类型PESSIMISTIC_READ
与PESSIMISTIC_WRITE
. 需要明确的是,我不是在问它们之间的区别,我是在问的范围PESSIMISTIC_WRITE
以及从一个应用程序实例获取该锁将如何影响其他可能尝试读取和更新同一行的应用程序实例数据库表。