Spring 中基于模式的事务

发布于 2024-11-18 10:24:42 字数 429 浏览 1 评论 0原文

我们使用 Spring+JPA 作为我们的RESTful Web 服务应用程序。这是一个高事务性应用程序,执行大量 CRUD 操作。

我在方法上使用 @Transaction 注释来执行事务,一切正常。

我只是想知道是否可以基于模式匹配在配置文件中的类之外管理事务,即以开头的所有方法>添加/更新/删除可以自动启用事务(不使用@Transaction注释)?

有人可以确认这是否可能吗?

如果“是”,请向我提供一些网络链接或示例。

谢谢。

We are using Spring+JPA for our RESTful web services application. This is a high transactional application and performs plenty of CRUD operations.

I am using @Transaction annotation on methods to perform the transaction and all is working fine.

I was just wondering if the Transaction can be managed outside the class in the configuration file based on pattern matching, i.e. all methods starting with add/update/delete can automatically be Transaction enabled (without the use of @Transaction annotation)?

Could someone please confirm if that’s possible?

If ‘Yes’ please provide me with some web link or example.

Thanks.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

旧情勿念 2024-11-25 10:24:42

当然!事实上,这是 Java 5 和 @Transactional 注释之前唯一可能的解决方案。请参阅10.5.2 声明式事务实现示例春季文档。在那里您将找到通过 XML 和 AspectJ 切入点进行事务划分配置的示例。

这是上述文档中的简单配置摘录:

<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource">
        <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
            <!-- ... -->
        </bean>
    </property>
</bean>
<tx:advice id="txAdvice" transaction-manager="txManager">
    <tx:attributes>
        <tx:method name="get*" read-only="true"/>
        <tx:method name="*"/>
    </tx:attributes>
</tx:advice>

<aop:config>
    <aop:pointcut id="fooServiceOperation" expression="execution(* x.y.service.FooService.*(..))"/>
    <aop:advisor advice-ref="txAdvice" pointcut-ref="fooServiceOperation"/>
</aop:config>

如您所见,所有名称以 get 为前缀的方法都被标记为只读,而所有其他方法FooService (xyservice.FooService.*(..)) 切入点)是事务性的,不是只读的。

正如您所看到的,使用更详细的 XML 语法给您带来了一些巨大的好处,例如声明性和更灵活的事务划分,这主要归功于 AspectJ 语法(请确保 首先学习它)。

Of course! In fact this was the only possible solution before Java 5 and @Transactional annotation. Look at 10.5.2 Example of declarative transaction implementation in Spring documentation. There you will find examples of transaction demarcation configuration via XML and AspectJ pointcuts.

This is a simple configuration excerpt from the documentation pointed above:

<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource">
        <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
            <!-- ... -->
        </bean>
    </property>
</bean>
<tx:advice id="txAdvice" transaction-manager="txManager">
    <tx:attributes>
        <tx:method name="get*" read-only="true"/>
        <tx:method name="*"/>
    </tx:attributes>
</tx:advice>

<aop:config>
    <aop:pointcut id="fooServiceOperation" expression="execution(* x.y.service.FooService.*(..))"/>
    <aop:advisor advice-ref="txAdvice" pointcut-ref="fooServiceOperation"/>
</aop:config>

As you can see, all methods with name prefixed with get are marked as read-only, while all other methods of FooService (x.y.service.FooService.*(..)) pointcut) are transactional and not read-only.

As you can see using more verbose XML syntax gives you some great benefits like declarative and more flexible transaction demarcation, mainly thanks to AspectJ syntax (make sure to learn it first).

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文