我有一个运行多线程的Hibernate事务方法“doImportImpl”。然而,某些记录需要按顺序导入,因此代码结构大致如下:
public RecordResult doImportImpl(String data) {
RecordResult result = new RecordResult();
.. do some data processing ..
String recordIdentifier = getIdentifier(data);
synchronized(recordIdentifier) {
process record;
}
return result;
}
有一种不同的事务方法,它也有记录标识符,不能与记录导入并行运行。因此它也在“记录标识符”上同步。
public void autoProcess(String data) {
String recordIdentifier = getIdentifier(data);
synchronized(recordIdentifier) {
List<Record> records = dao.queryDatabase(recordIdentifier);
for (Record r : records) {
autoprocess record;
}
}
}
问题在于:似乎有时方法autoProcess()
在doImportImpl()
的同步块完成之后开始运行,但是在事务提交之前。因此,由于tx隔离级别,对dao.queryDatabase()
的调用尚未在数据库中看到导入的记录。
如何确保同步锁一直保持在“return语句”中,包括方法调用的所有方面(处理Hibernate事务管理)?将return语句放入synchronized块是否足够?
由于 Simon Niederberger
答案 0 :(得分:0)
您必须使用数据库锁而不是synchronized
块。当您通过recordIdentifier
使用select for update
或您的数据库可用的内容查询记录时。
另外,对我来说,在String
s上同步也很有气味。