`
wolf_jack
  • 浏览: 7738 次
  • 来自: ...
文章分类
社区版块
存档分类
最新评论

使用JTA的事务处理(pro spring ch12范例)问题

阅读更多
在实施<spring专业开发指南>中12章多事务处理范例遇到问题,当指定由JTA管理的事务执行时,相关代码进入异常抛出部分:
TestControl.java
...
try {
accountManager.insert(account);
} catch (Exception ex) {
failures++;
}
...
每次insert都失败,failures值增加.原代码insert部分如下
public void insert(Account account) {
System.out.println("come on,folks");
doInsert(account);

jmsTemplate.send(queue, new MessageCreator() {

public Message createMessage(Session session) throws JMSException {
return session.createTextMessage("foobar");
}

});

if (random.nextInt(10) > 5) {
System.out.println("Fail now");
throw new IllegalArgumentException("fff");
}
}
将随机函数部分关闭后,所有提交仍无法成功.

配置文件如下:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
<bean id="urlMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="urlMap">
<map>
<entry key="*"><ref local="testController"/></entry>
</map>
</property>
</bean>

<bean id="testController" class="com.apress.prospring.ch12.web.TestController">
<property name="accountManager"><ref bean="accountManager"/></property>
</bean>
</beans>

applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">

<beans>

<bean id="accountDao" class="com.apress.prospring.ch12.data.SqlMapClientAccountDao">
<property name="dataSource"><ref bean="dataSource"/></property>
<property name="sqlMapClient"><ref bean="sqlMapClient"/></property>
</bean>

<bean id="historyDao" class="com.apress.prospring.ch12.data.UnreliableSqlMapClientHistoryDao">
<property name="dataSource"><ref bean="dataSource"/></property>
<property name="sqlMapClient"><ref bean="sqlMapClient"/></property>
</bean>

<bean id="accountManager" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
<property name="transactionManager"><ref bean="transactionManager"/></property>
<property name="target"><ref bean="accountManagerJTATarget"/></property>
<property name="transactionAttributes">
<props>
<prop key="insert*">PROPAGATION_REQUIRED, ISOLATION_READ_COMMITTED</prop>
<prop key="transfer*">PROPAGATION_REQUIRED, ISOLATION_SERIALIZABLE</prop>
<prop key="deposit*">PROPAGATION_REQUIRED, ISOLATION_READ_COMMITTED</prop>
</props>
</property>
</bean>
</beans>

已知的范例BUG有spring-xa-ds.xml,修改后如下
<?xml version="1.0" encoding="UTF-8"?>

<datasources>
<xa-datasource>
<jndi-name>XASpringDS</jndi-name>
<track-connection-by-tx/>
<isSameRM-override-value>false</isSameRM-override-value>
<xa-datasource-class>oracle.jdbc.xa.client.OracleXADataSource</xa-datasource-class>
<xa-datasource-property name="URL">jdbc:oracle:oci8:@orcl</xa-datasource-property>
<xa-datasource-property name="User">jboss</xa-datasource-property>
<xa-datasource-property name="Password">password</xa-datasource-property>
<exception-sorter-class-name>org.jboss.resource.adapter.jdbc.vendor.OracleExceptionSorter</exception-sorter-class-name>
<no-tx-separate-pools/>
</xa-datasource>
<mbean
code="org.jboss.resource.adapter.jdbc.vendor.OracleXAExceptionFormatter"
name="jboss.jca:service=OracleXAExceptionFormatter">
<depends optional-attribute-name="TransactionManagerService">
jboss:service=TransactionManager</depends>
</mbean>
</datasources>
(原文中mbean为
<mbean
code="org.jboss.resource.adapter.jdbc.xa.oracle.OracleXAExceptionFormatter"
name="jboss.jca:service=OracleXAExceptionFormatter">
<depends optional-attribute-name="TransactionManagerService">
jboss:service=TransactionManager</depends>
</mbean>
注意code部分类名区别,这是使用手册的bug)

applicationContext-as.xml有人说要将
<bean id="transactionManager" class="org.springframework.transaction.jta.JtaTransactionManager"/>
改为
<bean id="transactionManager" class="org.springframework.transaction.jta.JtaTransactionManager">
<property name="userTransactionName">
<value>UserTransaction</value>
</property>
</bean>
但实施后发现无明显区别.

需另外修改的地方包括源码ibatis目录下将Account-ora.xml和History-ora.xml改名为Account.xml,History.xml

jboss中的debug级日志如下
2007-01-12 00:12:29,930 DEBUG [org.springframework.web.servlet.DispatcherServlet] Testing handler map [org.springframework.web.servlet.handler.SimpleUrlHandlerMapping@130e79e] in DispatcherServlet with name 'spring-ch12'
2007-01-12 00:12:29,930 DEBUG [org.springframework.web.servlet.handler.SimpleUrlHandlerMapping] Looking up handler for [/test.html]
2007-01-12 00:12:29,930 DEBUG [org.springframework.web.servlet.DispatcherServlet] Testing handler adapter [org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter@1b64611]
2007-01-12 00:12:29,930 DEBUG [org.springframework.web.servlet.DispatcherServlet] Last-Modified value for [/spring-ch12/test.html] is [-1]
2007-01-12 00:12:29,930 DEBUG [org.springframework.web.servlet.DispatcherServlet] DispatcherServlet with name 'spring-ch12' received request for [/spring-ch12/test.html]
2007-01-12 00:12:29,930 DEBUG [org.springframework.web.servlet.DispatcherServlet] Testing handler adapter [org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter@1b64611]
2007-01-12 00:12:29,930 DEBUG [org.springframework.jdbc.datasource.DataSourceUtils] Opening JDBC connection
2007-01-12 00:12:31,118 DEBUG [java.sql.Connection] {conn-100006} Connection
2007-01-12 00:12:31,118 DEBUG [java.sql.Connection] {conn-100006} Preparing Statement:    select count(*) from Accounts 
2007-01-12 00:12:31,118 DEBUG [java.sql.PreparedStatement] {pstm-100007} Executing Statement:    select count(*) from Accounts 
2007-01-12 00:12:31,118 DEBUG [java.sql.PreparedStatement] {pstm-100007} Parameters: []
2007-01-12 00:12:31,118 DEBUG [java.sql.PreparedStatement] {pstm-100007} Types: []
2007-01-12 00:12:31,118 DEBUG [java.sql.ResultSet] {rset-100008} ResultSet
2007-01-12 00:12:31,118 DEBUG [java.sql.ResultSet] {rset-100008} Header: [COUNT(*)]
2007-01-12 00:12:31,118 DEBUG [java.sql.ResultSet] {rset-100008} Result: [0]
2007-01-12 00:12:31,118 DEBUG [org.springframework.jdbc.datasource.DataSourceUtils] Closing JDBC connection
2007-01-12 00:12:31,133 DEBUG [org.springframework.transaction.interceptor.TransactionInterceptor] Getting transaction for method 'insert' in class [com.apress.prospring.ch12.business.AccountManager]
2007-01-12 00:12:31,133 DEBUG [org.springframework.transaction.jta.JtaTransactionManager] Using transaction object [org.springframework.transaction.jta.JtaTransactionObject@5ec9da]
2007-01-12 00:12:31,133 DEBUG [org.springframework.transaction.jta.JtaTransactionManager] Creating new transaction
2007-01-12 00:12:31,133 DEBUG [org.springframework.transaction.jta.JtaTransactionManager] Beginning JTA transaction
2007-01-12 00:12:31,133 DEBUG [org.springframework.jdbc.datasource.DataSourceUtils] Opening JDBC connection
2007-01-12 00:12:31,133 DEBUG [java.sql.Connection] {conn-100009} Connection
2007-01-12 00:12:31,133 DEBUG [java.sql.Connection] {conn-100009} Preparing Statement:    select count(*) from Accounts 
2007-01-12 00:12:31,133 DEBUG [java.sql.PreparedStatement] {pstm-100010} Executing Statement:    select count(*) from Accounts 
2007-01-12 00:12:31,133 DEBUG [java.sql.PreparedStatement] {pstm-100010} Parameters: []
2007-01-12 00:12:31,133 DEBUG [java.sql.PreparedStatement] {pstm-100010} Types: []
2007-01-12 00:12:31,133 DEBUG [java.sql.ResultSet] {rset-100011} ResultSet
2007-01-12 00:12:31,133 DEBUG [java.sql.ResultSet] {rset-100011} Header: [COUNT(*)]
2007-01-12 00:12:31,133 DEBUG [java.sql.ResultSet] {rset-100011} Result: [0]
2007-01-12 00:12:31,133 DEBUG [org.springframework.jdbc.datasource.DataSourceUtils] Closing JDBC connection
2007-01-12 00:12:31,133 DEBUG [org.springframework.web.servlet.DispatcherServlet] Null ModelAndView returned to DispatcherServlet with name 'spring-ch12': assuming HandlerAdapter completed request handling
2007-01-12 00:12:31,133 DEBUG [org.springframework.web.servlet.DispatcherServlet] Successfully completed request
2007-01-12 00:12:31,133 DEBUG [org.springframework.web.context.support.XmlWebApplicationContext] Publishing event in context [XmlWebApplicationContext for namespace 'spring-ch12-servlet']: RequestHandledEvent: url=[/spring-ch12/test.html]; time=[1203ms]; client=[127.0.0.1]; method=[GET]; servlet=[spring-ch12]; session=[null]; user=[null]; status=[OK]
2007-01-12 00:12:31,133 DEBUG [org.springframework.web.context.support.XmlWebApplicationContext] Publishing event in context [Root XmlWebApplicationContext]: RequestHandledEvent: url=[/spring-ch12/test.html]; time=[1203ms]; client=[127.0.0.1]; method=[GET]; servlet=[spring-ch12]; session=[null]; user=[null]; status=[OK]
2007-01-12 00:17:52,305 DEBUG [org.jboss.resource.connectionmanager.IdleRemover] run: IdleRemover notifying pools, interval: 450000

JTA事务好象启动了,但却无法进入相关代码,没有挂JTA事务的JDBC操作部分完全正常,调试发现TestController.java中的
int count = accountManager.count();
执行正常,函数被正确解析到了JTAAccountManager.java使用的代码,但使用
accountManager.insert(account);
时,代码没有进入到JTAAccountManager.java部分(标记"come on,folks"未在上述LOG中出现)
也就是说,TestControl.java中AccountManager已可被解析到其代理实现类JTAAccountManager.java,但挂接JTA部分不能正常工作

pro spring的英文电子书下载地址:
ftp://222.214.218.42/20060927/8a0a863e-cc50-401d-b0d2-fb5561322f03.chm
原书中代码下载地址:
http://www.apress.com/ApressCorporate/supplement/1/405/1590594614-2446.zip

JBOSS版本为4.0.5,XA数据源使用书中推荐的ORACLE10g,jboss405\server\default\lib目录下部署的是oracle14.jar包.

如有达人不吝指教,不胜感激
分享到:
评论
9 楼 zzxanadu 2007-08-31  
这几天我也把这个例子实现了一下,JMS和JDBC全局事务都回滚成功,没遇到什么问题啊,你有什么问题??
8 楼 haihai 2007-03-08  
看看我的那个用Weblogic做的spring的jta事务的测试,是声明式的事务
7 楼 wolf_jack 2007-01-13  
楼贴问题基本查出,JTA不能支持代码中的ISOLATION_READ_COMMITTED隔离级别.使用默认级别前述问题消除.

新问题:
1.jms消息发出后,日志:
....
2007-01-13 21:48:49,171 DEBUG [org.jboss.mq.il.uil2.SocketManager] Failed to handle: org.jboss.mq.il.uil2.msgs.CloseMsg22893735[msgType: m_connectionClosing, msgID: -2147483641, error: null]
java.io.IOException: Client is not connected
at org.jboss.mq.il.uil2.SocketManager.internalSendMessage(SocketManager.java:264)
....
很奇怪,因为后面的log显示消息已正确收到并处理.

2.JTA提交报告失败,但在sqlplus中检查,数据已提交
...
2007-01-13 21:48:49,187 DEBUG [org.springframework.transaction.jta.JtaTransactionManager] Committing JTA transaction
2007-01-13 21:48:49,250 ERROR [org.jboss.resource.adapter.jdbc.xa.XAManagedConnectionFactory] End transaction failed for XAResource
oracle.jdbc.xa.OracleXAException
at oracle.jdbc.xa.OracleXAResource.checkError(OracleXAResource.java:962)
at oracle.jdbc.xa.client.OracleXAResource.end(OracleXAResource.java:355)
...

继续等待达人路过.-_-#
6 楼 wolf_jack 2007-01-12  
wolf_jack 写道
yananay 写道
但我用JTA的事务控制时,jboss 出来log 是
not found JTA with JNDI  java:comp/UserTransaction
(大概是这个意思)

这个就应该是 JTA 没配置对吧?


这个问题网上的解释多是classloader的问题,请检查你的.ear包,可参考
http://www.jboss.com/index.html?module=bb&op=viewtopic&t=69587

遵循该页指导,我将.WAR的LIB下清空后问题消除.
spring-ch12.ear
|
|-spring-ch12-web.war
|            |-META-INF
|            |-WEB-INF
|            |     |-class
|            |     |-lib(*.jar清空)
|
|-spring-ch12-ejb.jar
|            |-com
|            |-META-INF
|            |-*.JAR
如上图,ejb.jar中与.war中具有一些相同的JAR包,我去掉的是.war的lib中的,在本例中可行,你的程序可能需要具体尝试



http://static.springframework.org/spring/docs/2.0.x/api/org/springframework/transaction/jta/JtaTransactionManager.html的说明:
Some well-known JNDI locations are:
"java:comp/UserTransaction" for Resin 2.x, Oracle OC4J (Orion), JOnAS (JOTM), BEA WebLogic
"java:comp/TransactionManager" for Resin 3.x
"java:pm/TransactionManager" for Borland Enterprise Server and Sun Application Server (Sun ONE 7 and later)
"java:/TransactionManager" for JBoss Application Server

当使用2.0版的的spring.jar代替在二楼贴中的1.2.8版spring.jar和aopalliance.jar后(请注意二楼贴中所列文件的大小和时间),部署spring-ch12.ear时,JBOSS的log:
...
2007-01-12 18:45:07,765 DEBUG [org.springframework.transaction.jta.JtaTransactionManager] Retrieving JTA UserTransaction from JNDI location [java:comp/UserTransaction]
2007-01-12 18:45:07,765 DEBUG [org.springframework.jndi.JndiTemplate] Looking up JNDI object with name [java:comp/UserTransaction]
2007-01-12 18:45:07,765 DEBUG [org.springframework.transaction.jta.JtaTransactionManager] Retrieving JTA TransactionManager from JNDI location [java:comp/TransactionManager]
2007-01-12 18:45:07,765 DEBUG [org.springframework.jndi.JndiTemplate] Looking up JNDI object with name [java:comp/TransactionManager]
2007-01-12 18:45:07,765 DEBUG [org.springframework.transaction.jta.JtaTransactionManager] No JTA TransactionManager found at fallback JNDI location [java:comp/TransactionManager]
org.springframework.transaction.TransactionSystemException: JTA TransactionManager is not available at JNDI location [java:comp/TransactionManager]; nested exception is javax.naming.NameNotFoundException: TransactionManager not bound
Caused by:
javax.naming.NameNotFoundException: TransactionManager not bound
...

至于为何2.0的spring.jar会出现这个问题,"Spring2.0及以后的版本中声明式事务的配置与之前的版本有相当大的不同。主要差异在于不再需要配置TransactionProxyFactoryBean了。"
5 楼 wolf_jack 2007-01-12  
yananay 写道
但我用JTA的事务控制时,jboss 出来log 是
not found JTA with JNDI  java:comp/UserTransaction
(大概是这个意思)

这个就应该是 JTA 没配置对吧?


这个问题网上的解释多是classloader的问题,请检查你的.ear包,可参考
http://www.jboss.com/index.html?module=bb&op=viewtopic&t=69587

遵循该页指导,我将.WAR的LIB下清空后问题消除.
spring-ch12.ear
|
|-spring-ch12-web.war
|            |-META-INF
|            |-WEB-INF
|            |     |-class
|            |     |-lib(*.jar清空)
|
|-spring-ch12-ejb.jar
|            |-com
|            |-META-INF
|            |-*.JAR
如上图,ejb.jar中与.war中具有一些相同的JAR包,我去掉的是.war的lib中的,在本例中可行,你的程序可能需要具体尝试

4 楼 yananay 2007-01-12  
但我用JTA的事务控制时,jboss 出来log 是
not found JTA with JNDI  java:comp/UserTransaction
(大概是这个意思)

这个就应该是 JTA 没配置对吧?
3 楼 wolf_jack 2007-01-12  
yananay 写道
楼主 jboss 里怎么配置 JTA 啊?
谢谢了:)


JBOSS好象有个J2EE的包直接支持JTA,原贴中的spring-xa-ds.xml用于JBOSS下部署一个XA事务的数据源,问的是这个吗?
2 楼 yananay 2007-01-12  
楼主 jboss 里怎么配置 JTA 啊?
谢谢了:)
1 楼 wolf_jack 2007-01-12  
忘记说明,使用ant编译原书代码中build.xml配置时,生成的.ear文件有classloader问题,可将.war中的lib下文件全部去掉解决(.ejb下保有应有的lib文件).
我的build.xml使用的lib文件列表为
2004-08-24  21:37           100,776 commons-dbcp.jar
2006-11-22  19:44         1,223,877 xercesImpl.jar
2006-08-07  12:56            79,151 qdox-1.5.jar
2004-11-13  21:50         1,348,814 spring.jar
2006-11-30  17:18           383,531 ibatis-2.3.0.677.jar
2004-08-24  21:37            39,523 commons-pool.jar
2004-08-24  21:37           210,908 pg74.213.jdbc3.jar
2004-09-16  16:57            91,627 servlet-api.jar
2006-12-21  17:58            36,452 commons-attributes-api.jar
2006-12-21  18:46            29,590 commons-attributes-compiler.jar
2006-12-21  18:48             3,199 commons-attributes-plugin.jar
2004-09-16  16:57            12,822 ejb.jar
2004-08-18  20:58             4,467 aopalliance.jar
2004-09-16  16:57            25,998 jms.jar
这并非是最简的,但编译可用

相关推荐

    Spring配置JTA事务管理

    Spring框架在企业级Java应用中广泛用于实现事务管理,而JTA(Java Transaction API)是Java平台上的标准事务处理API,适用于分布式环境。本篇文章将深入探讨如何在Spring中配置JTA事务管理,以实现跨数据库和资源的...

    在Spring中使用JTA事务管理

    在Spring框架中,JTA(Java Transaction API)事务管理是一种用于处理分布式事务的高级机制,它允许应用程序在多个数据源之间进行协调的事务操作。本文将详细介绍如何在Spring中使用JTA事务管理,包括通过集成JOTM...

    事务处理:JTA事务

    JTA(Java Transaction API) 为 J2EE 平台提供了分布式事务服务。  要用 JTA 进行事务界定,应用程序要调用 javax.transaction.UserTransaction 接口中的方法。

    JTA事务源码示例

    如何处理跨库事物:spring + jtom 的jta事务是个很好的选择. 这个源码示例非常不错,包括所有的源码和jar包,下载后eclipse 或 myeclipse 导入就能用。 里面有详细的说明和注释,欢迎下载传播。有问题请在评价中...

    springboot整合jta实现多数据源事务管理

    本文将深入探讨如何配置和使用Spring Boot与JTA来管理多个数据库的数据源事务。 首先,JTA是Java平台企业版(Java EE)的一部分,它提供了一种标准的方式来管理和协调跨多个数据存储的事务。在Spring Boot中,我们...

    Springboot 动态多数据源 jta分布式事务

    总之,Spring Boot的多数据源和JTA分布式事务功能为企业级应用提供了强大的支撑,让开发者可以灵活地处理复杂的数据操作和事务管理。如果你是初学者,通过在线教程和提供的`demo`项目,相信你能够快速掌握这一技能。

    spring 结合druid和hibernate使用jta配置分布式事务

    5. **配置Spring事务管理器**:创建Atomikos事务管理器的bean,并配置Spring的PlatformTransactionManager,指定使用Atomikos的UserTransaction。 6. **代码实现**:在业务逻辑中,通过Spring的@Transactional注解...

    spring jta

    Spring作为一个开源的、全面的企业级应用开发框架,它提供了对JTA的集成,使得开发者能够在分布式环境中处理事务。JTA是Java平台标准的一部分,用于管理跨多个数据源(如数据库、消息队列等)的事务。 在Spring框架...

    分布式事务JTA之实践:Spring+ATOMIKOS

    Spring框架作为Java领域广泛使用的轻量级框架,提供了对JTA的支持,使得开发者可以方便地在应用中集成和管理事务。Spring的Transaction API允许我们通过编程或声明式方式控制事务,极大地简化了事务管理的复杂性。 ...

    spring + JTA + JOTM实现分布式事务

    本教程将深入探讨如何使用Spring框架、Java Transaction API (JTA) 和 Java Open Transaction Manager (JOTM) 来实现这样的分布式事务管理。 首先,我们来了解一下JTA。JTA是Java平台的标准事务API,它允许应用程序...

    Spring+iBatis+JOTM实现JTA事务

    在Java开发中,事务管理是确保数据一致性与完整性...然而,需要注意的是,JTA事务管理相对于本地事务会有一定的性能开销,因此在不需要分布式事务的情况下,可以选择使用Spring的本地事务管理,以提高系统的运行效率。

    分布式事务操作之Spring+JTA+mybatis源码

    了解和掌握这些知识点后,你将能够有效地在Spring环境中利用JTA和MyBatis来处理复杂的分布式事务,确保系统数据的一致性。对于"dimensyn"这个文件名,可能是项目的一部分,具体可能包含与上述概念相关的代码示例或...

    Spring Boot+Druid+Mybatis实现JTA分布式事务

    5. 开启Spring事务管理:在Spring的配置类中,启用@EnableTransactionManagement注解,配置PlatformTransactionManager为Atomikos的事务管理器。 6. 编写业务代码:在需要进行分布式事务的Service层方法上,使用@...

    Springboot+Atomikos+Jpa+Mysql实现JTA分布式事务

    本文将详细讲解如何利用Spring Boot、Atomikos、JPA(Java Persistence API)以及MySQL来实现JTA(Java Transaction API)分布式事务。 首先,Spring Boot是一个轻量级的框架,它简化了基于Spring的应用程序开发...

    JTA分布式事务使用示例代码

    本示例代码旨在展示如何在Java环境中使用JTA来解决多数据源的事务问题。 首先,我们需要了解JTA的基本概念。JTA定义了两个主要组件:Transaction Manager(事务管理器)和XAResource(事务资源)。事务管理器负责...

    spring+jotm+ibatis+mysql实现JTA分布式事务

    总的来说,这个项目展示了如何利用Spring的事务管理能力,结合JOTM作为事务协调器,以及iBATIS作为数据访问层,实现基于MySQL的JTA分布式事务处理。这不仅有助于理解分布式事务的原理,也为实际开发提供了可参考的...

    spring + JTA + atomikos 实现分布式事务

    Spring的PlatformTransactionManager接口是Spring事务管理的核心,它提供了一种抽象的方式来管理事务。当选择使用JTA时,可以使用Spring的JtaTransactionManager,它实现了PlatformTransactionManager,并且与JTA...

    springboot整合JTA组件,多数据源事务管理

    XA协议是数据库层面的一套分布式事务管理的规范,JTA是XA协议在Java中的实现,多个数据库或是消息厂商实现JTA接口,开发人员只需要调用SpringJTA接口即可实现JTA事务管理功能。 JTA事务比JDBC事务更强大。一个JTA事务...

    jta hibernate spring 集成 代码和说明

    2. **配置Spring**:在Spring的配置文件中,声明`PlatformTransactionManager`为`JtaTransactionManager`,这样Spring就知道使用JTA来处理事务。 3. **配置Hibernate**:在Hibernate的配置文件中,设置`hibernate....

    Jboss4.2.2+Spring2.5.6+hibernate+JTA事务的实现

    3. **配置Hibernate**:配置Hibernate的`hibernate.cfg.xml`,设置JTA数据源,并指定使用Spring的事务管理。 4. **编写业务逻辑**:在你的服务类中,你可以利用Spring的@Autowired注解注入需要的bean,然后在方法上...

Global site tag (gtag.js) - Google Analytics