我使用WebSphere 7和OpenJPA。
这是两个bean和persistance.xml的一部分:
<persistence-unit name="ASAP_Main">
<jta-data-source>jdbc/ASAPDB</jta-data-source>
<properties>
<property name="openjpa.Optimistic" value="false"/>
<property name="openjpa.ReadLockLevel" value="none"/>
<property name="openjpa.WriteLockLevel" value="none"/>
<property name="openjpa.LockManager" value="pessimistic(VersionCheckOnReadLock=false,VersionUpdateOnWriteLock=false)"/>
<property name="openjpa.LockTimeout" value="20000"/>
</properties>
</persistence-unit>
@PersistenceContext(unitName = "ASAP_Main")
private EntityManager em;
@MessageDriven
public class A implements MessageListener {
@EJB
private B b;
@TransactionAttribute(TransactionAttributeType.REQUIRED)
public void onMessage(Message message) {
b.processWithLock(message.getObject());
...
}
}
@Stateless
public class B{
@TransactionAttribute(TransactionAttributeType.REQUIRED)
public void processWithLock(Object obj){
em.lock(obj)
...
}
}
processWithLock 在执行后释放锁吗?
答案 0 :(得分:1)
您的MDB定义了事务边界,EJB B 只参与了由 A 启动的事务。 嵌套转换是不同的。
所有数据库锁都会保留,直到事务提交或回滚,即 A .onMessage()返回时。因此,当在全局事务中调用时, processWithLock 将不会在执行后释放锁。