【发布时间】:2020-08-18 17:17:50
【问题描述】:
我有消息队列,它提供带有一些实体字段更新信息的消息。有 10 个线程,处理来自队列的消息。
例如
- 第一个线程处理消息,该线程应该更新我的实体中的字段 A,ID 为 123。
- 第二个线程处理另一条消息,该线程应同时更新我的实体 ID 为 123 的字段 B。
有时更新后数据库不包含一些更新的字段。
一些更新:
someService.updateEntityFieldA(entityId, newFieldValue);
一些服务:
public Optional<Entity> findById(String entityId) {
return Optional.ofNullable(new DBWorker().findOne(Entity.class, entityId));
}
public void updateEntityFieldA(String entityId, String newFieldValue) {
findById(entityId).ifPresent(entity -> {
entity.setFieldA(newFieldValue);
new DBWorker().update(entity);
});
}
数据库工作者:
public <T> T findOne(final Class<T> type, Serializable entityId) {
T findObj;
try (Session session = HibernateUtil.openSessionPostgres()) {
findObj = session.get(type, entityId);
} catch (Exception e) {
throw new HibernateException("database error. " + e.getMessage(), e);
}
return findObj;
}
public void update(Object entity) {
try (Session session = HibernateUtil.openSessionPostgres()) {
session.beginTransaction();
session.update(entity);
session.getTransaction().commit();
} catch (Exception e) {
throw new HibernateException("database error. " + e.getMessage(), e);
}
}
HibernateUtil.openSessionPostgres() 每次从新会话获取
sessionFactory.openSession()
没有线程锁/乐观锁和悲观锁可以做这样的逻辑吗?
【问题讨论】:
标签: java multithreading hibernate jpa sql-update