java – AOP,Spring和事务范围
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了java – AOP,Spring和事务范围,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1498字,纯文字阅读大概需要3分钟。
内容图文
![java – AOP,Spring和事务范围](/upload/InfoBanner/zyjiaocheng/782/d39c18abd54949cbb4d64cfd5ad0b429.jpg)
想象一个事务性的多线程java应用程序,使用spring,jdbc和aop,m个包中的n个类都参与数据库转换.现在让我们说需要在一个事务中对一组任意类进行范围化.此外,在调用事务时提交事务的范围内始终有一个类T.
让我举一个明确的例子:
给出包A,B,Z和类A.Foo,B.Bar和Z.T.
调用各个类的以下实例(可能由不同的调用者和其他类之间):A.Foo,B.Bar,A.Foo,Z.T
只有在调用Z.T后才会提交事务.如果应用程序因任何原因而关闭,除非Z.T介入,否则将永远不会提交事务.
实例可以相互调用,并且如前所述,没有公共入口点从单个入口点(如服务层)调用所有实例,这将成为spring的事务标记的简单目标.
现在的问题是:使用方面可以解决这个问题吗?如果是这样,那么基本方法是什么?
谢谢.
解决方法:
您不需要单一的入口点,但您确实需要能够将事务拦截器应用于所有入口点,以便可重入调用可以参与同一事务.假设您可以这样做,您可以使用ThreadLocal标志和自定义org.springframework.transaction.support.TransactionSynchronization实现来完成此操作.
当提交可以安全进行时,您将修改Z.T以设置ThreadLocal标志.在您从TransactionTransactionManager调用的TransactionSynchronization.beforeCommit()实现中,您可以检查该标志并使用它来确定是否允许提交继续.如果标志不存在,您可以通过抛出RuntimeException来强制回滚.
需要注意的是,如果您有其他类型的交易(不涉及您所描述的3个协调类),您需要确保它们不会无意中回滚.为此,您可以通过另一个ThreadLocal标志在A.Foo,B.Bar和Z.T中标记此“特殊事务”,然后在上面提到的beforeCommit()方法的guard子句中检查该标志.伪代码:
void beforeCommit() {
if in special transaction
if commit flag not set
throw new RuntimeException("cancel transaction")
end if
end if
end
显然,这是一个黑客,我不会主张在绿地系统中做:).
内容总结
以上是互联网集市为您收集整理的java – AOP,Spring和事务范围全部内容,希望文章能够帮你解决java – AOP,Spring和事务范围所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。