我的应用程序部署在具有2个节点的weblogic 9群集环境中,并使用持久性提供程序toplink连接到MS SQL Server 2005。部署的应用程序是用Java编写的。在weblogic集群环境(群集内的多个节点)上工作时行锁定失败
我的应用程序需要的服务请求的时候做简单的操作:
- 开始交易
- 从表A和地方行选择项上他们锁定
- 处理它们
- 更新表A中结果。
- 结束交易
Java代码是这样的:
EntityManager em =Persistence.createEntityManagerFactory("NewPersistenceLevelPU").createEntityManager;
EntityTransaction transaction = em.getTransaction();
transaction.begin();
// step 2
em.createNativeQuery("select * from Table_A with(updlock, rowlock) where id = 123");
List<List<Object>> results = (List<List<Object>>) query.getResultList();
//step 3
SomeOperation(results);
// step 4, using the results from step 3
em.createNativeQuery("update Table_A set Column A = 'something' where id = 123");
// step 4
em.flush();
transaction.commit();
看来,如果我启动的节点1和节点2在同一时间请求,双方节点将能够继续到第3步,这超出了我的预期。因为我期望数据库应该已经被节点锁定(例如节点1),所以首先经过步骤2(因为with(updlock, rowlock)
),而后面的一个应该被阻塞直到第一个事务被提交。
我可以知道我是否有问题吗?非常感谢您的帮助你的回应
感谢。经过一番深入调查,我发现:
- 我们的方法实际上是由MDB
persistence.xml中被调用如下
<?xml version="1.0" encoding="UTF-8"?> <persistence version="1.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd"> <persistence-unit name="NewPersistenceLevelPU" transaction-type="JTA"> <provider>oracle.toplink.essentials.PersistenceProvider</provider> <jta-data-source>TestDB</jta-data-source> <properties> <property name="toplink.cache.type.default" value="" /> </properties> </persistence-unit> </persistence>
所以我现在想知道: 1.它是应用程序管理的还是容器管理的事务管理器? 2.在这两种情况下,我如何处理应用程序内的事务?使用UserTransaction或EntityTransaction?
非常感谢
非常感谢您的帮助! – 2012-02-14 10:05:55