Spring @Transactional timeout属性在不同传播中的工作原理

Spring @Transactional timeout属性在不同传播中的工作原理,spring,transactions,spring-3,Spring,Transactions,Spring 3,我对@Transactionaltimeout属性的行为感到困惑 我有下面的顺序 Main -> UserExecutionServiceImpl.executeRecordInvoice -> ProcessInvoiceServiceImpl.recordInvoice -> WarehouseServiceImpl.checkStockAvailability 要强制回滚异常,超时设置为0 如果executecordinvoice具有@Transactional(ti

我对@Transactionaltimeout属性的行为感到困惑

我有下面的顺序

Main -> 
UserExecutionServiceImpl.executeRecordInvoice ->
ProcessInvoiceServiceImpl.recordInvoice ->
WarehouseServiceImpl.checkStockAvailability
要强制回滚异常,超时设置为0

如果executecordinvoice具有
@Transactional(timeout=0)
则引发异常,并停止所有操作。这是有道理的

如果ExecuteCordinVoice具有
@Transactional
recordInvoice具有
@Transactional(timeout=0)
则不会引发异常。实际上,超时值已被忽略

我可以这样假设,因为事务实际上是以执行者记录文件开始的,而且这两种方法在默认情况下都有传播。Required,这意味着第二个(recordInvoice)被认为是在第一个(执行者记录文件)内,即已经存在的事务,哪个在运行

更重要的是,我做了两个简单的实验:

  • 如果ExecuteCordinVoice具有
    @Transactional
    recordInvoice具有
    @Transactional(propagation.propagation.REQUIRES\u NEW,timeout=0)
    则引发异常。现在起作用是因为新的事务在记录发票中开始,因此考虑了超时

  • 直接从主类调用
    ProcessInvoiceServiceImpl.recordInvoice
    ,使用
    @Transactional(propagation.propagation.REQUIRED,timeout=0)
    @Transactional(propagation.propagation.REQUIRES,timeout=0)
    ,再次考虑超时

  • 在这里之前,我很好,一切都有道理。但将1和2应用于WarehouseServiceImpl.checkStockAvailability,则不起作用:

  • 如果ExecuteCordinVoicerecordInvoice具有
    @Transactional
    (因此,默认情况下都是Propagation.REQUIRED)和checkStockAvailability具有
    @Transactional(Propagation.Propagation.REQUIRES\u NEW,timeout=0)
    。异常未被抛出

  • 直接从主类调用
    WarehouseServiceImpl.checkStockAvailability
    ,使用
    @Transactional(propagation.propagation.REQUIRED,timeout=0)
    @Transactional(propagation.propagation.REQUIRES,timeout=0)
    ,再次考虑超时

  • 类声明

    @Service
    @Transactional
    @Scope("prototype")
    public class WarehouseServiceImpl implements WarehouseService {
    
        // Unique method implementation
        @Transactional(propagation = Propagation.REQUIRES_NEW, timeout=0)
        public boolean checkStockAvailability(Product product, BigDecimal quantity) {
    
            ...
    
        return true;
    
        }
    }
    
    欢迎提出任何意见或建议

    Spring框架4.0.5

    多谢各位

    根据Andrei的建议,我有以下几点:

    @Transactional
    @Scope("prototype")
    @Service("processInvoiceService")
    public class ProcessInvoiceServiceImpl implements ProcessInvoiceService {
    
        @Override
        @Transactional(propagation = Propagation.REQUIRES_NEW, timeout=0)
        public void recordInvoice(InvoiceHeader invoiceHeader) {
    
    在主考班

    ProcessInvoiceService processInvoiceService = context.getBean(ProcessInvoiceService.class);
    
            try{
                processInvoiceService.recordInvoice(invoiceHeader03);
            }
            catch(Exception e){
                logger.error("ERROR ALFA: {}", e.getMessage());
            }
    
    WarehouseService warehouseService = context.getBean(WarehouseService.class);
    
            try{
                logger.info("Pre");
                boolean result = warehouseService.checkStockAvailability(product01, BigDecimal.ZERO);
                logger.info("result: {}", result);
                logger.info("Post");
            }
            catch(Exception e){
                logger.error("ERROR BETA: {}", e.getMessage());
            }
    
    显示控制台,部分显示结果输出

    Creating instance of bean 'processInvoiceService'
    20:16:57,320 DEBUG ctory.support.DefaultListableBeanFactory: 249 - Returning cached instance of singleton bean 'productService'
    20:16:57,320 DEBUG ctory.support.DefaultListableBeanFactory: 249 - Returning cached instance of singleton bean 'invoiceHeaderService'
    20:16:57,320 DEBUG ctory.support.DefaultListableBeanFactory: 249 - Returning cached instance of singleton bean 'invoiceDetailService'
    20:16:57,321 DEBUG ctory.support.DefaultListableBeanFactory: 449 - Creating instance of bean 'warehouseServiceImpl'
    20:16:57,321 DEBUG ctory.support.DefaultListableBeanFactory: 249 - Returning cached instance of singleton bean 'org.springframework.transaction.config.internalTransactionAdvisor'
    20:16:57,321 DEBUG xy.InfrastructureAdvisorAutoProxyCreator: 593 - Creating implicit proxy for bean 'warehouseServiceImpl' with 0 common interceptors and 1 specific interceptors
    20:16:57,321 DEBUG amework.aop.framework.JdkDynamicAopProxy: 117 - Creating JDK dynamic proxy: target source is SingletonTargetSource for target object [com.manuel.jordan.model.service.support.impl.WarehouseServiceImpl@7b4c50bc]
    20:16:57,321 DEBUG ctory.support.DefaultListableBeanFactory: 477 - Finished creating instance of bean 'warehouseServiceImpl'
    20:16:57,322  INFO e.process.impl.ProcessInvoiceServiceImpl:  46 - ProcessInvoiceServiceImpl arg constructor
    20:16:57,322 DEBUG ctory.support.DefaultListableBeanFactory: 249 - Returning cached instance of singleton bean 'org.springframework.transaction.config.internalTransactionAdvisor'
    20:16:57,322 DEBUG xy.InfrastructureAdvisorAutoProxyCreator: 593 - Creating implicit proxy for bean 'processInvoiceService' with 0 common interceptors and 1 specific interceptors
    20:16:57,322 DEBUG amework.aop.framework.JdkDynamicAopProxy: 117 - Creating JDK dynamic proxy: target source is SingletonTargetSource for target object [com.manuel.jordan.model.service.process.impl.ProcessInvoiceServiceImpl@5884a914]
    20:16:57,322 DEBUG ctory.support.DefaultListableBeanFactory: 477 - Finished creating instance of bean 'processInvoiceService'
    20:16:57,322 DEBUG ctory.support.DefaultListableBeanFactory: 249 - Returning cached instance of singleton bean 'transactionManager'
    20:16:57,322 DEBUG .datasource.DataSourceTransactionManager: 367 - Creating new transaction with name [com.manuel.jordan.model.service.process.impl.ProcessInvoiceServiceImpl.recordInvoice]: PROPAGATION_REQUIRES_NEW,ISOLATION_DEFAULT,timeout_0; ''
    20:16:57,322 DEBUG k.jdbc.datasource.SimpleDriverDataSource: 138 - Creating new JDBC Driver Connection to [jdbc:hsqldb:mem:testdb]
    20:16:57,323 DEBUG .datasource.DataSourceTransactionManager: 206 - Acquired Connection [org.hsqldb.jdbc.JDBCConnection@50378a4] for JDBC transaction
    20:16:57,323 DEBUG .datasource.DataSourceTransactionManager: 223 - Switching JDBC Connection [org.hsqldb.jdbc.JDBCConnection@50378a4] to manual commit
    20:16:57,323  INFO e.process.impl.ProcessInvoiceServiceImpl:  59 - ProcessInvoiceServiceImpl recordInvoice - start
    20:16:57,323 DEBUG ctory.support.DefaultListableBeanFactory: 249 - Returning cached instance of singleton bean 'transactionManager'
    20:16:57,323 DEBUG .datasource.DataSourceTransactionManager: 472 - Participating in existing transaction
    20:16:57,323 DEBUG ctory.support.DefaultListableBeanFactory: 249 - Returning cached instance of singleton bean 'transactionManager'
    20:16:57,323 DEBUG .datasource.DataSourceTransactionManager: 472 - Participating in existing transaction
    20:16:57,324 DEBUG g.springframework.jdbc.core.JdbcTemplate: 908 - Executing prepared SQL update
    20:16:57,324 DEBUG g.springframework.jdbc.core.JdbcTemplate: 627 - Executing prepared SQL statement [INSERT INTO invoiceheader(id, number, date, total) VALUES(?, ?, ?, ?)]
    20:16:57,324 DEBUG .datasource.DataSourceTransactionManager: 854 - Participating transaction failed - marking existing transaction as rollback-only
    20:16:57,324 DEBUG .datasource.DataSourceTransactionManager: 295 - Setting JDBC transaction [org.hsqldb.jdbc.JDBCConnection@50378a4] rollback-only
    20:16:57,324 DEBUG .datasource.DataSourceTransactionManager: 854 - Participating transaction failed - marking existing transaction as rollback-only
    20:16:57,325 DEBUG .datasource.DataSourceTransactionManager: 295 - Setting JDBC transaction [org.hsqldb.jdbc.JDBCConnection@50378a4] rollback-only
    20:16:57,325 DEBUG .datasource.DataSourceTransactionManager: 847 - Initiating transaction rollback
    20:16:57,325 DEBUG .datasource.DataSourceTransactionManager: 281 - Rolling back JDBC transaction on Connection [org.hsqldb.jdbc.JDBCConnection@50378a4]
    20:16:57,325 DEBUG .datasource.DataSourceTransactionManager: 324 - Releasing JDBC Connection [org.hsqldb.jdbc.JDBCConnection@50378a4] after transaction
    20:16:57,325 DEBUG ramework.jdbc.datasource.DataSourceUtils: 327 - Returning JDBC Connection to DataSource
    20:16:57,325 ERROR          com.manuel.jordan.main.MainTest:  93 - ERROR ALFA: Transaction timed out: deadline was Mon Jun 30 20:16:57 PET 2014
    20:16:57,325 DEBUG ctory.support.DefaultListableBeanFactory: 249 - Returning cached instance of singleton bean 'transactionManager'
    
    20:16:57,337 DEBUG ctory.support.DefaultListableBeanFactory: 449 - Creating instance of bean 'warehouseServiceImpl'
    20:16:57,337 DEBUG ctory.support.DefaultListableBeanFactory: 249 - Returning cached instance of singleton bean 'org.springframework.transaction.config.internalTransactionAdvisor'
    20:16:57,338 DEBUG xy.InfrastructureAdvisorAutoProxyCreator: 593 - Creating implicit proxy for bean 'warehouseServiceImpl' with 0 common interceptors and 1 specific interceptors
    20:16:57,338 DEBUG amework.aop.framework.JdkDynamicAopProxy: 117 - Creating JDK dynamic proxy: target source is SingletonTargetSource for target object [com.manuel.jordan.model.service.support.impl.WarehouseServiceImpl@23f5b5dc]
    20:16:57,338 DEBUG ctory.support.DefaultListableBeanFactory: 477 - Finished creating instance of bean 'warehouseServiceImpl'
    20:16:57,338  INFO          com.manuel.jordan.main.MainTest: 102 - Pre
    20:16:57,338 DEBUG ion.AnnotationTransactionAttributeSource: 108 - Adding transactional method 'WarehouseServiceImpl.checkStockAvailability' with attribute: PROPAGATION_REQUIRES_NEW,ISOLATION_DEFAULT,timeout_0; ''
    20:16:57,338 DEBUG ctory.support.DefaultListableBeanFactory: 249 - Returning cached instance of singleton bean 'transactionManager'
    20:16:57,339 DEBUG .datasource.DataSourceTransactionManager: 367 - Creating new transaction with name [com.manuel.jordan.model.service.support.impl.WarehouseServiceImpl.checkStockAvailability]: PROPAGATION_REQUIRES_NEW,ISOLATION_DEFAULT,timeout_0; ''
    20:16:57,339 DEBUG k.jdbc.datasource.SimpleDriverDataSource: 138 - Creating new JDBC Driver Connection to [jdbc:hsqldb:mem:testdb]
    20:16:57,339 DEBUG .datasource.DataSourceTransactionManager: 206 - Acquired Connection [org.hsqldb.jdbc.JDBCConnection@34bde49d] for JDBC transaction
    20:16:57,339 DEBUG .datasource.DataSourceTransactionManager: 223 - Switching JDBC Connection [org.hsqldb.jdbc.JDBCConnection@34bde49d] to manual commit
    20:16:57,339 DEBUG .datasource.DataSourceTransactionManager: 755 - Initiating transaction commit
    20:16:57,339 DEBUG .datasource.DataSourceTransactionManager: 266 - Committing JDBC transaction on Connection [org.hsqldb.jdbc.JDBCConnection@34bde49d]
    20:16:57,339 DEBUG .datasource.DataSourceTransactionManager: 324 - Releasing JDBC Connection [org.hsqldb.jdbc.JDBCConnection@34bde49d] after transaction
    20:16:57,339 DEBUG ramework.jdbc.datasource.DataSourceUtils: 327 - Returning JDBC Connection to DataSource
    20:16:57,339  INFO          com.manuel.jordan.main.MainTest: 104 - result: true
    20:16:57,339  INFO          com.manuel.jordan.main.MainTest: 105 - Post
    
    错误消息将以预期的方式显示

    现在是另一节课

    @Service
    @Transactional
    @Scope("prototype")
    public class WarehouseServiceImpl implements WarehouseService {
    
        private static final Logger logger = LoggerFactory.getLogger(WarehouseServiceImpl.class);
    
        @Override
        @Transactional(propagation = Propagation.REQUIRES_NEW, timeout=0)
        public boolean checkStockAvailability(Product product, BigDecimal quantity) {
    
    在主考班

    ProcessInvoiceService processInvoiceService = context.getBean(ProcessInvoiceService.class);
    
            try{
                processInvoiceService.recordInvoice(invoiceHeader03);
            }
            catch(Exception e){
                logger.error("ERROR ALFA: {}", e.getMessage());
            }
    
    WarehouseService warehouseService = context.getBean(WarehouseService.class);
    
            try{
                logger.info("Pre");
                boolean result = warehouseService.checkStockAvailability(product01, BigDecimal.ZERO);
                logger.info("result: {}", result);
                logger.info("Post");
            }
            catch(Exception e){
                logger.error("ERROR BETA: {}", e.getMessage());
            }
    
    显示控制台,部分显示结果输出

    Creating instance of bean 'processInvoiceService'
    20:16:57,320 DEBUG ctory.support.DefaultListableBeanFactory: 249 - Returning cached instance of singleton bean 'productService'
    20:16:57,320 DEBUG ctory.support.DefaultListableBeanFactory: 249 - Returning cached instance of singleton bean 'invoiceHeaderService'
    20:16:57,320 DEBUG ctory.support.DefaultListableBeanFactory: 249 - Returning cached instance of singleton bean 'invoiceDetailService'
    20:16:57,321 DEBUG ctory.support.DefaultListableBeanFactory: 449 - Creating instance of bean 'warehouseServiceImpl'
    20:16:57,321 DEBUG ctory.support.DefaultListableBeanFactory: 249 - Returning cached instance of singleton bean 'org.springframework.transaction.config.internalTransactionAdvisor'
    20:16:57,321 DEBUG xy.InfrastructureAdvisorAutoProxyCreator: 593 - Creating implicit proxy for bean 'warehouseServiceImpl' with 0 common interceptors and 1 specific interceptors
    20:16:57,321 DEBUG amework.aop.framework.JdkDynamicAopProxy: 117 - Creating JDK dynamic proxy: target source is SingletonTargetSource for target object [com.manuel.jordan.model.service.support.impl.WarehouseServiceImpl@7b4c50bc]
    20:16:57,321 DEBUG ctory.support.DefaultListableBeanFactory: 477 - Finished creating instance of bean 'warehouseServiceImpl'
    20:16:57,322  INFO e.process.impl.ProcessInvoiceServiceImpl:  46 - ProcessInvoiceServiceImpl arg constructor
    20:16:57,322 DEBUG ctory.support.DefaultListableBeanFactory: 249 - Returning cached instance of singleton bean 'org.springframework.transaction.config.internalTransactionAdvisor'
    20:16:57,322 DEBUG xy.InfrastructureAdvisorAutoProxyCreator: 593 - Creating implicit proxy for bean 'processInvoiceService' with 0 common interceptors and 1 specific interceptors
    20:16:57,322 DEBUG amework.aop.framework.JdkDynamicAopProxy: 117 - Creating JDK dynamic proxy: target source is SingletonTargetSource for target object [com.manuel.jordan.model.service.process.impl.ProcessInvoiceServiceImpl@5884a914]
    20:16:57,322 DEBUG ctory.support.DefaultListableBeanFactory: 477 - Finished creating instance of bean 'processInvoiceService'
    20:16:57,322 DEBUG ctory.support.DefaultListableBeanFactory: 249 - Returning cached instance of singleton bean 'transactionManager'
    20:16:57,322 DEBUG .datasource.DataSourceTransactionManager: 367 - Creating new transaction with name [com.manuel.jordan.model.service.process.impl.ProcessInvoiceServiceImpl.recordInvoice]: PROPAGATION_REQUIRES_NEW,ISOLATION_DEFAULT,timeout_0; ''
    20:16:57,322 DEBUG k.jdbc.datasource.SimpleDriverDataSource: 138 - Creating new JDBC Driver Connection to [jdbc:hsqldb:mem:testdb]
    20:16:57,323 DEBUG .datasource.DataSourceTransactionManager: 206 - Acquired Connection [org.hsqldb.jdbc.JDBCConnection@50378a4] for JDBC transaction
    20:16:57,323 DEBUG .datasource.DataSourceTransactionManager: 223 - Switching JDBC Connection [org.hsqldb.jdbc.JDBCConnection@50378a4] to manual commit
    20:16:57,323  INFO e.process.impl.ProcessInvoiceServiceImpl:  59 - ProcessInvoiceServiceImpl recordInvoice - start
    20:16:57,323 DEBUG ctory.support.DefaultListableBeanFactory: 249 - Returning cached instance of singleton bean 'transactionManager'
    20:16:57,323 DEBUG .datasource.DataSourceTransactionManager: 472 - Participating in existing transaction
    20:16:57,323 DEBUG ctory.support.DefaultListableBeanFactory: 249 - Returning cached instance of singleton bean 'transactionManager'
    20:16:57,323 DEBUG .datasource.DataSourceTransactionManager: 472 - Participating in existing transaction
    20:16:57,324 DEBUG g.springframework.jdbc.core.JdbcTemplate: 908 - Executing prepared SQL update
    20:16:57,324 DEBUG g.springframework.jdbc.core.JdbcTemplate: 627 - Executing prepared SQL statement [INSERT INTO invoiceheader(id, number, date, total) VALUES(?, ?, ?, ?)]
    20:16:57,324 DEBUG .datasource.DataSourceTransactionManager: 854 - Participating transaction failed - marking existing transaction as rollback-only
    20:16:57,324 DEBUG .datasource.DataSourceTransactionManager: 295 - Setting JDBC transaction [org.hsqldb.jdbc.JDBCConnection@50378a4] rollback-only
    20:16:57,324 DEBUG .datasource.DataSourceTransactionManager: 854 - Participating transaction failed - marking existing transaction as rollback-only
    20:16:57,325 DEBUG .datasource.DataSourceTransactionManager: 295 - Setting JDBC transaction [org.hsqldb.jdbc.JDBCConnection@50378a4] rollback-only
    20:16:57,325 DEBUG .datasource.DataSourceTransactionManager: 847 - Initiating transaction rollback
    20:16:57,325 DEBUG .datasource.DataSourceTransactionManager: 281 - Rolling back JDBC transaction on Connection [org.hsqldb.jdbc.JDBCConnection@50378a4]
    20:16:57,325 DEBUG .datasource.DataSourceTransactionManager: 324 - Releasing JDBC Connection [org.hsqldb.jdbc.JDBCConnection@50378a4] after transaction
    20:16:57,325 DEBUG ramework.jdbc.datasource.DataSourceUtils: 327 - Returning JDBC Connection to DataSource
    20:16:57,325 ERROR          com.manuel.jordan.main.MainTest:  93 - ERROR ALFA: Transaction timed out: deadline was Mon Jun 30 20:16:57 PET 2014
    20:16:57,325 DEBUG ctory.support.DefaultListableBeanFactory: 249 - Returning cached instance of singleton bean 'transactionManager'
    
    20:16:57,337 DEBUG ctory.support.DefaultListableBeanFactory: 449 - Creating instance of bean 'warehouseServiceImpl'
    20:16:57,337 DEBUG ctory.support.DefaultListableBeanFactory: 249 - Returning cached instance of singleton bean 'org.springframework.transaction.config.internalTransactionAdvisor'
    20:16:57,338 DEBUG xy.InfrastructureAdvisorAutoProxyCreator: 593 - Creating implicit proxy for bean 'warehouseServiceImpl' with 0 common interceptors and 1 specific interceptors
    20:16:57,338 DEBUG amework.aop.framework.JdkDynamicAopProxy: 117 - Creating JDK dynamic proxy: target source is SingletonTargetSource for target object [com.manuel.jordan.model.service.support.impl.WarehouseServiceImpl@23f5b5dc]
    20:16:57,338 DEBUG ctory.support.DefaultListableBeanFactory: 477 - Finished creating instance of bean 'warehouseServiceImpl'
    20:16:57,338  INFO          com.manuel.jordan.main.MainTest: 102 - Pre
    20:16:57,338 DEBUG ion.AnnotationTransactionAttributeSource: 108 - Adding transactional method 'WarehouseServiceImpl.checkStockAvailability' with attribute: PROPAGATION_REQUIRES_NEW,ISOLATION_DEFAULT,timeout_0; ''
    20:16:57,338 DEBUG ctory.support.DefaultListableBeanFactory: 249 - Returning cached instance of singleton bean 'transactionManager'
    20:16:57,339 DEBUG .datasource.DataSourceTransactionManager: 367 - Creating new transaction with name [com.manuel.jordan.model.service.support.impl.WarehouseServiceImpl.checkStockAvailability]: PROPAGATION_REQUIRES_NEW,ISOLATION_DEFAULT,timeout_0; ''
    20:16:57,339 DEBUG k.jdbc.datasource.SimpleDriverDataSource: 138 - Creating new JDBC Driver Connection to [jdbc:hsqldb:mem:testdb]
    20:16:57,339 DEBUG .datasource.DataSourceTransactionManager: 206 - Acquired Connection [org.hsqldb.jdbc.JDBCConnection@34bde49d] for JDBC transaction
    20:16:57,339 DEBUG .datasource.DataSourceTransactionManager: 223 - Switching JDBC Connection [org.hsqldb.jdbc.JDBCConnection@34bde49d] to manual commit
    20:16:57,339 DEBUG .datasource.DataSourceTransactionManager: 755 - Initiating transaction commit
    20:16:57,339 DEBUG .datasource.DataSourceTransactionManager: 266 - Committing JDBC transaction on Connection [org.hsqldb.jdbc.JDBCConnection@34bde49d]
    20:16:57,339 DEBUG .datasource.DataSourceTransactionManager: 324 - Releasing JDBC Connection [org.hsqldb.jdbc.JDBCConnection@34bde49d] after transaction
    20:16:57,339 DEBUG ramework.jdbc.datasource.DataSourceUtils: 327 - Returning JDBC Connection to DataSource
    20:16:57,339  INFO          com.manuel.jordan.main.MainTest: 104 - result: true
    20:16:57,339  INFO          com.manuel.jordan.main.MainTest: 105 - Post
    
    错误未按预期方式抛出

    Omicron

    新的更新代码:

    @Service
    @Transactional
    @Scope("prototype")
    public class WarehouseServiceImpl implements WarehouseService {
    
        private static final Logger logger = LoggerFactory.getLogger(WarehouseServiceImpl.class);
    
        private ProductService productService;
    
        @Autowired
        public WarehouseServiceImpl(ProductService productService){
            this.productService = productService;
        }
    
        @Override
        @Transactional(propagation = Propagation.REQUIRES_NEW, timeout=0)
        public boolean checkStockAvailability(Product product, BigDecimal quantity) {
    
            logger.info("Amount: {}", this.productService.getAmountProducts());
            ...     
            return true;
    
        }
    
    }
    
    上面显示的代码对于这两个项目是相同的,对于一个使用JdbcTemplate的项目,all OK,会抛出预期的错误,但是另一个使用Hibernate的项目不会抛出预期的错误。低于结果输出

    08:27:06,782  INFO          com.manuel.jordan.main.MainTest: 102 - Pre
    08:27:06,782 DEBUG ctory.support.DefaultListableBeanFactory: 249 - Returning cached instance of singleton bean 'transactionManager'
    08:27:06,782 DEBUG m.hibernate4.HibernateTransactionManager: 367 - Creating new transaction with name [com.manuel.jordan.model.service.support.impl.WarehouseServiceImpl.checkStockAvailability]: PROPAGATION_REQUIRES_NEW,ISOLATION_DEFAULT,timeout_0; ''
    08:27:06,783 DEBUG m.hibernate4.HibernateTransactionManager: 417 - Opened new Session [SessionImpl(PersistenceContext[entityKeys=[],collectionKeys=[]];ActionQueue[insertions=org.hibernate.engine.spi.ExecutableList@57ce634f updates=org.hibernate.engine.spi.ExecutableList@b8a7e43 deletions=org.hibernate.engine.spi.ExecutableList@35835fa orphanRemovals=org.hibernate.engine.spi.ExecutableList@56f71edb collectionCreations=org.hibernate.engine.spi.ExecutableList@7207cb51 collectionRemovals=org.hibernate.engine.spi.ExecutableList@2a27cb34 collectionUpdates=org.hibernate.engine.spi.ExecutableList@6892cc6f collectionQueuedOps=org.hibernate.engine.spi.ExecutableList@6fd1660 unresolvedInsertDependencies=UnresolvedEntityInsertActions[]])] for Hibernate transaction
    08:27:06,783 DEBUG m.hibernate4.HibernateTransactionManager: 427 - Preparing JDBC Connection of Hibernate Session [SessionImpl(PersistenceContext[entityKeys=[],collectionKeys=[]];ActionQueue[insertions=org.hibernate.engine.spi.ExecutableList@57ce634f updates=org.hibernate.engine.spi.ExecutableList@b8a7e43 deletions=org.hibernate.engine.spi.ExecutableList@35835fa orphanRemovals=org.hibernate.engine.spi.ExecutableList@56f71edb collectionCreations=org.hibernate.engine.spi.ExecutableList@7207cb51 collectionRemovals=org.hibernate.engine.spi.ExecutableList@2a27cb34 collectionUpdates=org.hibernate.engine.spi.ExecutableList@6892cc6f collectionQueuedOps=org.hibernate.engine.spi.ExecutableList@6fd1660 unresolvedInsertDependencies=UnresolvedEntityInsertActions[]])]
    08:27:06,783 DEBUG gine.jdbc.internal.LogicalConnectionImpl: 226 - Obtaining JDBC connection
    08:27:06,783 DEBUG k.jdbc.datasource.SimpleDriverDataSource: 138 - Creating new JDBC Driver Connection to [jdbc:hsqldb:mem:testdb]
    08:27:06,783 DEBUG gine.jdbc.internal.LogicalConnectionImpl: 232 - Obtained JDBC connection
    08:27:06,783 DEBUG .transaction.spi.AbstractTransactionImpl: 160 - begin
    08:27:06,783 DEBUG ransaction.internal.jdbc.JdbcTransaction:  69 - initial autocommit status: true
    08:27:06,783 DEBUG ransaction.internal.jdbc.JdbcTransaction:  71 - disabling autocommit
    08:27:06,784 DEBUG m.hibernate4.HibernateTransactionManager: 488 - Exposing Hibernate transaction as JDBC transaction [org.hsqldb.jdbc.JDBCConnection@4a6c18ad]
    08:27:06,784 DEBUG ctory.support.DefaultListableBeanFactory: 249 - Returning cached instance of singleton bean 'transactionManager'
    08:27:06,784 DEBUG m.hibernate4.HibernateTransactionManager: 362 - Found thread-bound Session [SessionImpl(PersistenceContext[entityKeys=[],collectionKeys=[]];ActionQueue[insertions=org.hibernate.engine.spi.ExecutableList@57ce634f updates=org.hibernate.engine.spi.ExecutableList@b8a7e43 deletions=org.hibernate.engine.spi.ExecutableList@35835fa orphanRemovals=org.hibernate.engine.spi.ExecutableList@56f71edb collectionCreations=org.hibernate.engine.spi.ExecutableList@7207cb51 collectionRemovals=org.hibernate.engine.spi.ExecutableList@2a27cb34 collectionUpdates=org.hibernate.engine.spi.ExecutableList@6892cc6f collectionQueuedOps=org.hibernate.engine.spi.ExecutableList@6fd1660 unresolvedInsertDependencies=UnresolvedEntityInsertActions[]])] for Hibernate transaction
    08:27:06,784 DEBUG m.hibernate4.HibernateTransactionManager: 472 - Participating in existing transaction
    08:27:06,784 DEBUG ctory.support.DefaultListableBeanFactory: 249 - Returning cached instance of singleton bean 'transactionManager'
    08:27:06,784 DEBUG m.hibernate4.HibernateTransactionManager: 362 - Found thread-bound Session [SessionImpl(PersistenceContext[entityKeys=[],collectionKeys=[]];ActionQueue[insertions=org.hibernate.engine.spi.ExecutableList@57ce634f updates=org.hibernate.engine.spi.ExecutableList@b8a7e43 deletions=org.hibernate.engine.spi.ExecutableList@35835fa orphanRemovals=org.hibernate.engine.spi.ExecutableList@56f71edb collectionCreations=org.hibernate.engine.spi.ExecutableList@7207cb51 collectionRemovals=org.hibernate.engine.spi.ExecutableList@2a27cb34 collectionUpdates=org.hibernate.engine.spi.ExecutableList@6892cc6f collectionQueuedOps=org.hibernate.engine.spi.ExecutableList@6fd1660 unresolvedInsertDependencies=UnresolvedEntityInsertActions[]])] for Hibernate transaction
    08:27:06,784 DEBUG m.hibernate4.HibernateTransactionManager: 472 - Participating in existing transaction
    08:27:06,785 DEBUG                        org.hibernate.SQL: 109 - select count(*) as col_0_0_ from product product0_
    08:27:06,785 DEBUG              org.hibernate.loader.Loader: 951 - Result set row: 0
    08:27:06,786 DEBUG              org.hibernate.loader.Loader:1485 - Result row: 
    08:27:06,786  INFO ervice.support.impl.WarehouseServiceImpl:  45 - Amount: 6
    08:27:06,786 DEBUG m.hibernate4.HibernateTransactionManager: 755 - Initiating transaction commit
    08:27:06,786 DEBUG m.hibernate4.HibernateTransactionManager: 551 - Committing Hibernate transaction on Session [SessionImpl(PersistenceContext[entityKeys=[],collectionKeys=[]];ActionQueue[insertions=org.hibernate.engine.spi.ExecutableList@57ce634f updates=org.hibernate.engine.spi.ExecutableList@b8a7e43 deletions=org.hibernate.engine.spi.ExecutableList@35835fa orphanRemovals=org.hibernate.engine.spi.ExecutableList@56f71edb collectionCreations=org.hibernate.engine.spi.ExecutableList@7207cb51 collectionRemovals=org.hibernate.engine.spi.ExecutableList@2a27cb34 collectionUpdates=org.hibernate.engine.spi.ExecutableList@6892cc6f collectionQueuedOps=org.hibernate.engine.spi.ExecutableList@6fd1660 unresolvedInsertDependencies=UnresolvedEntityInsertActions[]])]
    08:27:06,786 DEBUG .transaction.spi.AbstractTransactionImpl: 175 - committing
    08:27:06,786 DEBUG ransaction.internal.jdbc.JdbcTransaction: 113 - committed JDBC Connection
    08:27:06,786 DEBUG ransaction.internal.jdbc.JdbcTransaction: 126 - re-enabling autocommit
    08:27:06,787 DEBUG m.hibernate4.HibernateTransactionManager: 633 - Closing Hibernate Session [SessionImpl(PersistenceContext[entityKeys=[],collectionKeys=[]];ActionQueue[insertions=org.hibernate.engine.spi.ExecutableList@57ce634f updates=org.hibernate.engine.spi.ExecutableList@b8a7e43 deletions=org.hibernate.engine.spi.ExecutableList@35835fa orphanRemovals=org.hibernate.engine.spi.ExecutableList@56f71edb collectionCreations=org.hibernate.engine.spi.ExecutableList@7207cb51 collectionRemovals=org.hibernate.engine.spi.ExecutableList@2a27cb34 collectionUpdates=org.hibernate.engine.spi.ExecutableList@6892cc6f collectionQueuedOps=org.hibernate.engine.spi.ExecutableList@6fd1660 unresolvedInsertDependencies=UnresolvedEntityInsertActions[]])] after transaction
    08:27:06,787 DEBUG gine.jdbc.internal.LogicalConnectionImpl: 246 - Releasing JDBC connection
    08:27:06,787 DEBUG gine.jdbc.internal.LogicalConnectionImpl: 264 - Released JDBC connection
    08:27:06,787  INFO          com.manuel.jordan.main.MainTest: 104 - result: true
    08:27:06,787  INFO          com.manuel.jordan.main.MainTest: 105 - Post
    

    一些线索?当然存在DataAccess…

    查看您的第一个日志(与
    recordInvoice
    checkStockAvailability
    的超时问题相关),这些确实表明事务行为已正确应用:在Java代码级别,事务已启动并提交。日志中唯一的区别是,使用
    recordInvoice
    时,会对数据库执行实际的查询,而使用
    checkStockAvailability
    时,则不会执行此类查询

    对此的一个可能答案是,如果数据库没有活动,那么就没有数据库级别的事务。java代码中的内容反映在db级别。例如,如果打开一个MySQL控制台并在表中插入一些内容,那么最后需要提交以在DB中查看结果


    与您的第二个问题相关,其中一个测试使用
    JdbcTemplate
    ,另一个测试使用Hibernate(使用
    HibernateTransactionManager
    ),查看下表,似乎只考虑严格大于0的值。因此,一个简单的测试涉及将超时设置为1秒,而在事务方法
    checkStockAvailability
    中,可以添加一个
    线程。sleep(1500)
    可能会显示0秒超时值被忽略,从而解释测试结果。

    检查日志。您是否看到有关正在创建/提交的事务的消息?这应该是一个很好的指示,如果你的方法是真正的事务性的,如果是,使用什么参数。启用调试级别日志记录并测试应用程序。我可以看看你的日志文件,如果你可以把它发到。谢谢安德烈,这里确实有些奇怪,我这个周末要做这个检查。谢谢,您在
    检查库存可用性
    中做了什么?我没有看到像我在
    recordInvoice
    中看到的那样的数据库查询:
    执行准备好的SQL语句[插入到invoiceheader(id、number、date、total)值(?,?,?)]
    。否则,日志非常清楚,事务是使用正确的设置启动的:requires_new、timeout 0等。如果数据库没有活动,则没有数据库级别的事务:-)。java代码中的内容反映在db级别。例如,如果打开MySQL控制台并在表中插入内容。最后,您需要提交以DB;-)格式查看结果。这就是事务。我查看了Hibernate事务的源代码,似乎只考虑严格大于0的值。看见尝试