美好的一天,
以下是我的原始代码:
Criteria criteria = getSession( ).createCriteria(
JSNumber.class );
criteria.add( Restrictions.eq( "paymentDate", mnight ) );
JSNumber result = (JSNumber) criteria
.uniqueResult( );
int newNo = result.getRunningNo( ) + 1;
result.setRunningNo( newNo );
getSession( ).merge( result );
getSession( ).flush( );
这是从JSNumber表中获取运行编号。假设数字为12,然后+ 1变为13,然后在数据库中将运行数字改为13。
有一个错误,当时间几乎相同时,只是在毫秒内,两个请求从/向此表获取结果/更新,它可能会为两个用户请求返回相同的结果。
例如,第一次请求在14:47:36.735,第二次请求在14:47:36.737第一次请求获取值= 110,它将更新为111.但在第一次请求更新值之前,第二次请求已经获得价值,也是110。
我正在尝试使用beginTransaction()
来处理此案例。以下是我的新代码:
Transaction tx = null;
tx = getSession().beginTransaction( );
Criteria criteria = getSession( ).createCriteria(
JSNumber.class );
criteria.add( Restrictions.eq( "paymentDate", mnight ) );
JSNumber result = (JSNumber) criteria
.uniqueResult( );
int newNo = result.getRunningNo( ) + 1;
result.setRunningNo( newNo );
getSession( ).merge( result );
getSession( ).flush( );
tx.commit( );
这将会点击java.sql.SQLException: You cannot commit during a managed transaction!
我是Hibernate的新手。请告知我犯的错误。我试着长时间谷歌,但看起来无法找到我理解的方式。
答案 0 :(得分:0)
您的交易有可能发生 正在由休眠的其他人(最有可能是容器)管理 这就是例外情况 在这些托管环境的情况下,Hibernate无法自行处理Transaction。 由该受管环境完成的事务处理(开始,提交或回滚数据库事务)。
请阅读transactions-demarcation以清楚了解原因