【问题标题】:How application can be notified when Spring Transaction Manager rollbacks a SQL transaction?Spring Transaction Manager 回滚 SQL 事务时如何通知应用程序?
【发布时间】:2017-04-10 06:37:51
【问题描述】:

在基于 Spring 的应用程序中,事务管理器负责提交或回滚 SQL 事务。 我的应用程序对持久数据的某些部分使用自定义缓存。 此缓存不受 Spring 或 Hibernate 管理。

如果 SQL 事务遇到错误并且必须回滚,那么缓存修改也应该回滚。

我的问题是,当 Spring Transaction Manager 回滚事务时,如何注册一个将调用我的 cache.evict() 方法的事件侦听器或回调?

【问题讨论】:

    标签: spring spring-transactions


    【解决方案1】:

    您可以为此使用TransactionSynchronizationAdapter。作为参考,你可以看看这个:Spring - commit JMS Transaction after JPA transaction

    在链接中给出的答案中,为afterCommit 注册了同步。在您的情况下,它将是afterCompletion。在该实现中,您将需要检查事务是否处于回滚状态并执行缓存驱逐。

    【讨论】:

    • 我不会这样...看来你每次都得加... =>代码重复
    【解决方案2】:

    有很多方法可以做到这一点......

    1. 您可以根据需要使用应用程序事件...Application Events in Spring Framework 4.2
    2. 您可以抛出自定义运行时异常,并且可以在异常处理程序中处理它(如果您使用的是 Spring MVC)。但是这里我不建议在这里做任何重要的操作,比如清除缓存...Exception handling in Spring MVC
    3. 您可以使用#1 和#2 的组合。您可以发送一个事件,该事件最终会引发您在 UI 中处理的运行时异常(spring mvc 或您使用的任何东西)。 我会这样做
    4. 您可以抛出异常,任何调用您的 bean 的人都会得到您想要的自定义事务异常,并且必须处理通知...我不推荐这样做

    【讨论】:

    • 不幸的是,这种方法对我不起作用,因为我无法控制抛出异常的应用程序的这一部分。事实上,我的代码是一个应用程序使用的库(JaVers)。所以当回滚发生时,我需要得到应用程序的事务管理器的通知
    猜你喜欢
    • 2013-05-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-15
    • 1970-01-01
    • 1970-01-01
    • 2019-04-30
    • 2018-05-23
    • 2019-07-27
    相关资源
    最近更新 更多