栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

如何避免嵌套事务不支持的错误?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

如何避免嵌套事务不支持的错误?

在您的“我的代码”代码段中,可能存在一些问题:

  1. 发生异常时,没有
    finally
    阻止关闭会话的块
  2. 您正在打电话
    session.close()
    ,但这与有所不同
    HibernateUtils.closeSession()
    。因此,
    ThreadLocal
    不会清除。
  3. 没有
    catch
    例外。结果是没有
    rollback
  4. 您是抛出异常还是被(静默)忽略?

如果之后的“待办事项”块中有异常

begin()
,则事务保持打开状态,并且
ThreadLocal
不清除。

您的代码可能正常工作,但是在高负载下可能会发生(SQL锁定)超时等情况,在这种情况下,偶尔会抛出异常。

因此,请检查 每个 代码段以进行 正确的 异常处理:

final Session session = HibernateUtil.getSession();try {  final Transaction transaction = session.beginTransaction();  try {    // The real work is here    transaction.commit();  } catch (Exception ex) {    // Log the exception here    transaction.rollback();    throw ex;  }} finally {  HibernatilUtil.closeSession();}

您可以向

HibernateUtil.getSession()
和添加一些“簿记”代码
HibernateUtil.closeSession()
:记录每次访问,包括线程的名称。最终,同一线程必须进行一次或多次“获取”,然后再进行“关闭”。

在您的情况下,我什至会考虑只有一个“ get”,并且只要您的线程正在执行其工作单元,就传递该会话:这样一来,发现问题可能会更容易。


关于SO的另一个问题报告了类似的问题:Hibernate4.1.9(最新的最终构建)报告了不支持嵌套事务。

您可以在

commit()
检查之后添加一些代码,以确认交易是否真的完成了(通过调用
wasCommitted()
)。

Javadoc中的引文

wasCommitted()

即使成功调用commit(),此方法也可能返回false。例如,如果基于JTA的策略没有启动事务,则它们对no(op)的调用不执行操作。在这种情况下,他们还报告wasCommitted()为假。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/381982.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号