事务回滚,但插入一条记录

2023-11-29

大家好,我已经使用 jsf、spring 3.0、hybernate + JPA 和atomikos 进行了 XA 交易管理,mysql 是我的后端,这里一切正常,但是插入操作,当异常抛出时,交易应该回滚,但是它没有发生!这是我们应用程序的一个小流程 我正在使用 jsfmanagementbean 来调用我的服务,我的交易将从我的服务类开始

TextileUIBean.java
包 com.textile.web; 公共类 TextileUIBean 扩展 BaseManagedBean 实现 Serialized, { 公共插入付款详细信息() { PaymentDetails PaymentDetails=new PaymentDetails(); // 值是硬编码的,只有两个属性仅使用 PaymentDetails.setCustomerName("Manikandan"); PaymentDetails.setAmount(1000); getTextileManager().insertPaymentDetails(PaymentDetails); } 公共 ITextileManager getTextileManager() { TextileManager = (ITextileManager) getBean("textileManager"); 返回textileManager; } }

   service class


  package com.textile.web
       public interface ITextileManager 
       {
         public void insertPaymentDetails(PaymentDetails PaymentDetails);
       }
        package com.textile.web
        public class TextileManager implements ITextileManager 
            {
            ITextileBusiness  TextileBusiness ;

            public void setTextileBusiness(ITextileBusiness textileBusiness) {
           this.textileBusiness = textileBusiness;
             }
             void insertPaymentDetails(PaymentDetails PaymentDetails)
             {
              TextileBusiness.insertPaymentDetails(PaymentDetails);


             }

        and my business class is 


package com.textile.web

             public interface ITextileBusiness
             {
              public void insertPaymentDetails(PaymentDetails PaymentDetails);
             }

             package com.textile.web
             public class TextileBusiness implements ITextileBusiness 
             {
             ITextileDao  textileDao;

            public void setTextileDao(ITextileDao textileDao) {
           this.textileDao = textileDao;
             }
             void insertPaymentDetails(PaymentDetails ormPaymentTable)
             {

               OrmPaymentTable ormPaymentTable= OrmPaymentTable();
                ormPaymentTable.setCustomerName(PaymentDetails.getCustomerName());
           ormPaymentTable.setAmount(PaymentDetails.getAmount(););
              textileDao.insertPaymentDetails(ormPaymentTable);
                               int a=0;
                if(a==0)
                    throw new BusinessException("Transcation Rollback");            

             }
             }
         and my dao class is 


 package com.textile.web
             public interface IPaymentsDao {
              public void insertPaymentDetails(OrmPaymentTable ormPaymentTable);
              }
               package com.textile.web
               public class PaymentsDao implements IPaymentsDao
               {
               void insertPaymentDetails(OrmPaymentTable ormPaymentTable)
               {
               this.getJpaTemplate().persist(ormPaymentTable);
                  after this line the record is insertinf into table               
               }               
               }


           my FacesConfig.xml is 


   <application>
            <el-resolver>org.springframework.web.jsf.el.SpringBeanFacesELResolver</el-resolver>
            <locale-config>
            <default-locale>en</default-locale>
            <supported-locale>en</supported-locale>
            </locale-config>
            <message-bundle>Messages</message-bundle>
            </application>
            <managed-bean>          <managed-bean-name>textileUIBean</managed-bean-name>                                                    <managed-bean-class>com.textile.web.TextileUIBean</managed-bean-class>
    <managed-bean-scope>view</managed-bean-scope>
</managed-bean>

我的 applicationConfig.xml 文件是

<beans:bean id="dataSource"
        class="org.springframework.jndi.JndiObjectFactoryBean" >
        <beans: property name="jndiName">
            <beans: value>java:comp/env/jdbc/textWeb</beans:value>
        </beans: property> 
        <beans: property name="resourceRef">
            <beans:value>true</beans:value>
        </beans: property>
     </beans: bean>
        <beans: bean id="jpaTemplate" class="org.springframework.orm.jpa.JpaTemplate">
        <beans: property name="entityManagerFactory">
            <beans: ref bean="entityManagerFactory" />
        </beans: property>
    </beans: bean>
    <beans: bean id="entityManagerFactory"
        class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
        <!-- hidden by shiju  because we need one datasource support its  in prsistence.xml !-->
        <beans: property name="dataSource">
            <beans: ref bean="dataSource" />
        </beans: property>
         <beans: property name="persistenceUnitName" value="payhub" />
        <beans: property name="jpaVendorAdapter">
            <beans:bean
                class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
                <beans: property name="generateDdl" value="false" />
                <beans: property name="showSql" value="true" />
                <beans: property name="databasePlatform" value="${database.target}" />
            </beans: bean>
        </beans: property>
        <beans: property name="persistenceXmlLocation">
            <beans: value>classpath:META-INF/persistence.xml</beans:value>
        </beans: property>
    </beans: bean>
<beans:bean id="textileManager"
        class=" com.textile.web.TextileManager">
        <beans: property name="textileBusiness" ref="textileBusiness" />
    </beans: bean>
    <beans: bean id="textileBusiness" class="com.textile.web.TextileBusiness">
        <beans: property name="textileDao" ref="textileDao" />       
    </beans: bean>
    <beans: bean id="textileDao" class="com.textile.web.textileDao">
        <beans: property name="jpaTemplate">
            <beans: ref bean="jpaTemplate"/>
        </beans: property>
    </beans: bean>

     <aop:config>
            <aop:pointcut id="fooServiceOperation"  expression="execution(* com.textile.web.*.*(..))"/>
             <aop:advisor advice-ref="txAdvice" pointcut-ref="fooServiceOperation"/>
             </aop:config>
    <tx:advice id="txAdvice" transaction-manager="transactionManager">
     <tx:attributes>             
           <tx:method name="*" propagation="REQUIRED"/>
        </tx:attributes>
    </tx:advice>

        <beans: bean id="atomikosTransactionManager"
        class="com.atomikos.icatch.jta.UserTransactionManager" init-method="init"
        destroy-method="close">
        <beans: property name="forceShutdown" value="true" />
        <beans: property name="startupTransactionService" value="true" />
    </beans:bean>

    <beans:bean id="atomikosUserTransaction" class="com.atomikos.icatch.jta.UserTransactionImp">
        <beans: property name="transactionTimeout">
            <beans: value>3000</beans:value>
        </beans: property>
    </beans:bean>

    <beans: bean id="transactionManager"
        class="org.springframework.transaction.jta.JtaTransactionManager">
        <beans: property name="transactionManager">
            <beans: ref bean="atomikosTransactionManager" />
        </beans: property>
        <beans: property name="userTransaction">
            <beans: ref bean="atomikosUserTransaction"/>
        </beans: property>
            <beans: property name="rollbackOnCommitFailure" value="true">
            </beans: property>
    </beans: bean>

 and orm.xml file is 




<entity class="OrmPaymentTable" name="OrmPaymentTable">
<table name="ta_payment" />
<attributes>
<id name="paymentId">
<column name="USER_ID" />
<generated-value strategy="AUTO" />
</id>
<basic name="customerName">
<column name="CUST_NAME" length="50" />
</basic>
<basic name="amount">
<column name="AMOUNT" length="50" />
</basic>
</attributes>
</entity> 

<persistence-unit name="payhub" transaction-type="JTA">
        <provider>org.hibernate.ejb.HibernatePersistence</provider> 
        <jta-data-source>java:comp/env/jdbc/textWeb</jta-data-source>
         <mapping-file>META-INF/orm.xml</mapping-file>
         <class>com.textile.web.OrmPaymentTable</class>
         <properties>
            <property name="hibernate.transaction.manager_lookup_class"
                value="com.atomikos.icatch.jta.hibernate3.TransactionManagerLookup"/>

             <property name="hibernate.transaction.factory_class"
                value="org.hibernate.transaction.JTATransactionFactory" />
 </properties>
    </persistence-unit>
</persistence>

我在meta-inf/context.xml中配置jndi

<Context>
         <Transaction factory="com.atomikos.icatch.jta.UserTransactionFactory"/> 
         <Resource name="jdbc/textWeb" auth="Container"
        driverClassName="com.mysql.jdbc.Driver" user="root" password="root"
        type="com.mysql.jdbc.jdbc2.optional.MysqlXADataSource" factory="com.mysql.jdbc.jdbc2.optional.MysqlDataSourceFactory"
        url="jdbc:mysql://localhost:3306/textWeb" explicitUrl="true"
        pinGlobalTxToPhysicalConnection="true">
    </Resource> 
    </Context>

web.xml 

         <resource-ref>
   <description>PaymentsDatabase</description>
   <res-ref-name>jdbc/textWeb</res-ref-name>
   <res-type>javax.sql.DataSource</res-type>
   <res-auth>Container</res-auth>
   <res-sharing-scope>Shareable</res-sharing-scope>
</resource-ref>

我跟踪日志..查看我的事务日志详细信息

 78 [main] INFO atomikos - USING core version: 3.6.4
78 [main] INFO atomikos - USING com.atomikos.icatch.console_file_name = tm.out
78 [main] INFO atomikos - USING com.atomikos.icatch.console_file_count = 1
78 [main] INFO atomikos - USING com.atomikos.icatch.automatic_resource_registration = true
78 [main] INFO atomikos - USING com.atomikos.icatch.client_demarcation = false
78 [main] INFO atomikos - USING com.atomikos.icatch.threaded_2pc = true
78 [main] INFO atomikos - USING com.atomikos.icatch.serial_jta_transactions = false
78 [main] INFO atomikos - USING com.atomikos.icatch.log_base_dir = .\
94 [main] INFO atomikos - USING com.atomikos.icatch.console_log_level = WARN
94 [main] INFO atomikos - USING com.atomikos.icatch.max_actives = 50
94 [main] INFO atomikos - USING com.atomikos.icatch.checkpoint_interval = 500
94 [main] INFO atomikos - USING com.atomikos.icatch.enable_logging = false
94 [main] INFO atomikos - USING com.atomikos.icatch.output_dir = .\
94 [main] INFO atomikos - USING com.atomikos.icatch.log_base_name = tmlog
94 [main] INFO atomikos - USING com.atomikos.icatch.console_file_limit = 0
94 [main] INFO atomikos - USING com.atomikos.icatch.max_timeout = 300000
94 [main] INFO atomikos - USING com.atomikos.icatch.tm_unique_name = PaymentsTransactions
94 [main] INFO atomikos - USING java.naming.factory.initial = com.sun.jndi.rmi.registry.RegistryContextFactory
94 [main] INFO atomikos - USING java.naming.provider.url = rmi://localhost:1099
94 [main] INFO atomikos - USING com.atomikos.icatch.service = com.atomikos.icatch.standalone.UserTransactionServiceFactory
94 [main] INFO atomikos - USING com.atomikos.icatch.force_shutdown_on_vm_exit = false
94 [main] INFO atomikos - USING com.atomikos.icatch.default_jta_timeout = 10000
INFO - JtaTransactionManager.checkUserTransactionAndTransactionManager(469) | Using JTA UserTransaction: com.atomikos.icatch.jta.UserTransactionImp@16a6027
INFO - JtaTransactionManager.checkUserTransactionAndTransactionManager(480) | Using JTA TransactionManager: com.atomikos.icatch.jta.UserTransactionManager@e68513
DEBUG - NameMatchTransactionAttributeSource.addTransactionalMethod(94) | Adding transactional method [*] with attribute [PROPAGATION_REQUIRED,ISOLATION_DEFAULT]
DEBUG - AbstractPlatformTransactionManager.getTransaction(365) | Creating new transaction with name [com.evolvus.payments.manager.IPaymentsManager.findColumnChartDisplayByGateWays]: PROPAGATION_REQUIRED,ISOLATION_DEFAULT
40500 [http-8080-Processor24] WARN atomikos - Attempt to create a transaction with a timeout that exceeds com.atomikos.icatch.max_timeout - truncating to: 300000
40641 [http-8080-Processor24] INFO atomikos - THREADS: using JDK thread pooling...
40703 [http-8080-Processor24] INFO atomikos - createCompositeTransaction ( 3000000 ): created new ROOT transaction with id PaymentsTransactions0000100688
DEBUG - AbstractPlatformTransactionManager.handleExistingTransaction(470) | Participating in existing transaction
DEBUG - AbstractPlatformTransactionManager.handleExistingTransaction(470) | Participating in existing transaction
DEBUG - AbstractPlatformTransactionManager.processRollback(850) | Participating transaction failed - marking existing transaction as rollback-only
DEBUG - JtaTransactionManager.doSetRollbackOnly(1060) | Setting JTA transaction rollback-only
49110 [http-8080-Processor24] INFO atomikos - setRollbackOnly() called for transaction PaymentsTransactions0000100688
DEBUG - AbstractPlatformTransactionManager.processRollback(843) | Initiating transaction rollback
49172 [http-8080-Processor24] INFO atomikos - afterCompletion ( STATUS_ROLLEDBACK ) called  on Synchronization: org.hibernate.transaction.CacheSynchronization
49172 [http-8080-Processor24] INFO atomikos - afterCompletion ( STATUS_ROLLEDBACK ) called  on Synchronization: org.hibernate.ejb.EntityManagerImpl$1@1f6e48a
49172 [http-8080-Processor24] INFO atomikos - rollback() done of transaction PaymentsTransactions0000100688

你可以帮帮我吗 ?


显然,您的数据库插入不是在事务管理器当前事务的范围内发生的。

一些想法:

1)也许它只是不在您的帖子中,但我在您的服务类上没有看到 Spring @Transactional 注释。您控制交易边界的策略是什么?

2) 因为您使用的是 JNDI,所以我们看不到您的数据源,但如果您使用的是 Atomikos,您应该使用他们的 XA 感知池数据源。你是?

3) 您应该将 Atomikos 正常日志记录增加到 DEBUG,以准确查看它正在处理哪些 SQL 命令。

4) Atomikos 保留正常日志文件之外的事务日志。这些用于恢复和其他目的。您还应该检查这些线索。

希望这可以帮助。

Update:

MySQL 对 XA 事务有一些限制,您可以在这里了解here。在 context.xml 中尝试此配置,至少看看它是否有效。它使用来自 Atomikos 的 XA 感知(但不支持 XA)数据源。如果这有效,那么你可以从那里开始:

<Transaction factory="com.atomikos.icatch.jta.UserTransactionFactory" />

并定义 JNDI 数据源以注入实体管理器:

<Resource name="jdbc/myDataSource" auth="Container"
factory="org.apache.naming.factory.BeanFactory"
type="com.atomikos.jdbc.nonxa.AtomikosNonXADataSourceBean"
uniqueResourceName="myMySqlDatabase" driverClassName="com.mysql.jdbc.Driver" url="......" user="....." password="...." maxPoolSize="20" reapTimeout="300" />

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

事务回滚,但插入一条记录 的相关文章

随机推荐

  • 使用 getDrawingCache 时提高图像质量 - android

    我正在使用捕获我的布局视图getDrawingCache 方法并从中创建图像 代码工作正常并且生成了图像 但这里的问题是 生成的图像质量非常低 我希望生成的图像的分辨率很高 这样每当我将其设置为ImageView它不会被拉伸 这是我正在使用
  • 如何从较大的字符串中提取字符串?

    如果输出的 HTML 页面具有以下内容 使用 jQuery 如何查找 提取 Spartan 字符串 a href mytlnet logout php t e22df53bf4b5fc0a087ce48897e65ec0 b Logout
  • 在 Windows 批处理脚本中解析并存储 json 文件中的文本

    我有一个包含以下内容的 json 文件 STATUS PASS PASSRATE 96 95238 我想存储密码 以便我可以使用它附加到文件名 Check jsonextractor bat您可以使用它通过给定的点表示的对象路径从 json
  • 将生成的代码保存在“rtwbuild”中的特殊文件夹中

    我在用rtwbuild从模拟图生成 C 代码 并希望将生成的代码保存到任意目录 有什么办法可以做到吗 您可以通过 3 种不同的方式控制生成文件的文件夹 您可以在 Simulink Preferences 中设置 代码生成文件夹 选项 您可以
  • 为什么 Java 编译器作为可执行文件而不是 JVM 字节码分发?

    在答案中Java 字节码中的平台独立性 据说Java编译器在所有平台上都是相同的 我确实明白这一点 我的问题是为什么 Java 编译器作为 exe 文件 对于 Windows 分发 为什么不作为 JVM 字节码由 JRE 执行 这样就不会有
  • 如何将 Windows Phone 8.1 Silverlight 应用程序发布到 Windows Phone 商店?

    我创建了 Windows Phone 8 1 Silverlight 应用程序 但无法将其上传到 WP 商店 我想用Create App PackagesVisual Studio 2013 Professional 中提供了一个工具 但对
  • Entity Framework 6 ToString()、格式化(DateTime 格式)、查询拦截

    我没有找到在 DateTime DateTime 字段中使用 linq2sql 进行搜索的正确方法 db Items Where x gt x DateTime1 ToString Contains 2014 08 不起作用 因为在 lin
  • 如何使用纬度和经度计算距离?

    我有一个带有纬度和经度的表 Lat Longitude 40 8151 73 0455 U 36103 40 8132 73 0476 U 36103 所以我想要的是我从我的页面传递两个经度和纬度我如何使用存储过程找到最近的地方我对此没有太
  • 如何在 Swift 中保存从 UIImagePickerController 中选取的图像?

    我正在构建一个应用程序 让用户从其照片库中选择图像 我正在使用这段代码来保存它 func imagePickerController picker UIImagePickerController didFinishPickingImage
  • 捕获要在 ASP.NET 中处理的 IIS 级别错误

    我正在 IIS 7 上使用 C 开发一个 ASP NET 站点 但我希望得到一个也适用于 IIS 6 的答案 该网站的一部分功能是能够一次上传最多 5 张图像 我有一个很好的算法来调整上传的图像大小到我的最佳大小和比例 因此 我唯一真正的大
  • 使用正则表达式提取括号之间的文本

    在这样的句子中 x 阿尔法 33 贝塔 我提取一组括号内的数据作为 x 33 使用 VBA 正则表达式模式 x d 我无法直接将未括起来的数据数组提取为 x 33 使用网络资源建议进行模式 lt 这是 VBA 特定问题吗 即对其 Regex
  • Visual Studio Code - 如何向 python 路径添加多个路径?

    我正在尝试使用 Visual Studio Code 到目前为止 它看起来很棒 轻 快等 我正在尝试让我的 Python 应用程序之一运行 该应用程序使用虚拟环境 但也使用不在我的虚拟环境的站点包中的库 我知道在settings json
  • 公历到希伯来语

    如何将公历日期转换为等效的希伯来日期 另外请告诉我这些日历 因为我对此了解不多 有一个方便的类叫做NSCalendar 您可以像这样创建一个 NSCalendar gregorian NSCalendar alloc initWithCal
  • 自动 Killall 然后 Killall 9 级

    有时我想killall某个进程 但正在运行killall不起作用 因此 当我尝试再次启动该进程时 它会失败 因为前一个会话仍在运行 然后我就得无聊的跑killall 9在上面 所以为了简化我的生活 我创建了一个realkill脚本 它是这样
  • java.io.FileNotFoundException:(访问被拒绝)

    我试图读取文件夹内的文件 但是当我运行程序时它会抛出此异常 我也尝试过其他一些文件夹 它抛出相同的异常 Exception in thread main java io FileNotFoundException C backup Acce
  • Delphi 中重复直到中使用的函数 Sleep() 的奇怪行为

    我的功能是单击按钮时的反应 当我单击按钮时 它应该开始重复并写入数组中的值 并将它们显示在主窗体的标签中 问题在于功能睡眠 有一些错误或其他原因 因为当我单击按钮时 它等待了很长一段时间 然后它最终开始执行操作 但速度很快 让我们看看我的代
  • JavaScript 缩放整个 Div

    我正在寻找一个可以放大整个 div 的 JQuery 脚本 我找到了以下插件 http test dpetroff ru jquery iviewer test and 这些插件正是我需要的东西 只需用滚轮放大和缩小 但我有一个问题 我需要
  • npm install 在出现如此多的警告后给出错误

    我的 ReactJS 项目直到上周都运行良好 但从周日开始 它在 npm install 上出现以下错误 PS C Projects Interface ClientApp gt npm install npm WARN deprecate
  • 如何使用IpropertyStorage读取文件的属性?

    如何使用 iPropertyStorage 读取文件的属性 如标题 作者 页数等 谁知道c 中的代码请发布它 实际上 我正在尝试以编程方式 使用 c 读取文件属性 标题 摘要 作者 注释等 当您看到文件的属性时 摘要 选项卡上显示的内容 F
  • 事务回滚,但插入一条记录

    大家好 我已经使用 jsf spring 3 0 hybernate JPA 和atomikos 进行了 XA 交易管理 mysql 是我的后端 这里一切正常 但是插入操作 当异常抛出时 交易应该回滚 但是它没有发生 这是我们应用程序的一个