我正在使用带有mysql数据库的hibernate,但在单个事务中进行多个更新时遇到了问题。
以下是我的代码
public void updateOEMUser(OEMUserDetailsDTO userDTO) throws Exception{
Session session = GCCPersistenceMangerFactory.getSessionFactory().openSession();
Transaction tx = null;
try{
String query = "update oemuserdata set full_name=\""+userDTO.getFullName()+ "\" ,contact_no=\""+userDTO.getContactNo() + "\" where user_id="+userDTO.getUserId();
String query1 = "update usermasterdata set account_status="+userDTO.getAccountStatus() + " ,user_name=\"" + userDTO.getUserName() + "\" where user_id="+userDTO.getUserId();
Query q = session.createSQLQuery(query);
Query q1 = session.createSQLQuery(query1);
tx = session.beginTransaction();
q.executeUpdate();
q1.executeUpdate();
tx.commit();
}catch (HibernateException e) {
if (tx!=null) tx.rollback();
e.printStackTrace();
throw new RuntimeException("HibernateException_updateOEMUser");
}finally {
session.close();
}
}
代码可以工作,但当我使"q1.executeUpdate()“失败时,"oemuserdata”中的记录在Mysql中被锁定。
我做错了什么吗?
发布于 2014-01-24 07:35:55
试着使用这样的模式。
StringBuilder query = new StringBuilder();
query.append("UPDATE CLASSNAME_FIRST a ,");
query.append("CLASSNAME_SECOND b,");
query.append("SET a.full_name='"+userDTO.getFullName()",");
.....
int var = stmt.executeUpdate(query);
发布于 2014-01-28 05:15:38
好吧,我没有找到解决方案,但我发现了这里发生了什么。
当我在成功执行q.executeUpdate()之后删除连接时,在执行q1.executeUpdate()时抛出异常,在catch块之后,它进入最后一个块并尝试执行session.close(),,但由于没有数据库连接,这也失败了。
但是Mysql仍然拥有q.executeUpdate().请求的锁。这就是为什么行被锁定,直到Mysql释放锁本身。
https://stackoverflow.com/questions/21326837
复制