相关疑难解决方法(0)

Spring @Transactional rollback不工作

我有一个如下代码

   public abstract class AffltTransactionService implements IAffltTransactionService {
    ....

        @Override
        @Transactional
        public void processTransactions(List<? extends AffltTransaction> transactions) {
            for (AffltTransaction transaction : transactions) {
                if (transaction != null) {
                    processTransaction(transaction);
                }
            }
        }

        private void processTransaction(AffltTransaction transaction) {
            try {
                processTransactionInternal(transaction);

            } catch (Exception exception) {
                affltTransactionError = new AffltTransactionError(null, null, "error", new Date());
                saveAffltTransactionError(affltTransactionError);
                log.error(exception.getLocalizedMessage());
            }
        }

        @Transactional(readOnly=false, rollbackFor = Exception.class, propagation = Propagation.REQUIRES_NEW)
        public void processTransactionInternal(AffltTransaction transaction) {
Run Code Online (Sandbox Code Playgroud)

processTransactionInternal抛出ServiceUnAvailableException,它扩展了RuntimeException

但是,尽管有rollbackFor = Exception.class,事务仍未回滚.你能帮忙吗?

spring transactions commit transactional rollback

2
推荐指数
1
解决办法
9356
查看次数

从另一个@Transactional注释方法中调用@Transactional注释方法

当我从另一个事务方法调用一个事务方法,现在我的第二个事务方法完成,又回到第一个事务方法时,会发生什么,不幸的是它失败了,所以它将回滚所有内容,这意味着它将回滚第二个事务方法的更改.. ?? 注意:两种方法都在同一个类中

@Transactional 
public void method1(){
   //do something
   call method2();
  //do something
  ...
  ...
  failed here
}

@Transactional
public void method2(){
  //do something
  save()
}
Run Code Online (Sandbox Code Playgroud)

因此,在上面的示例中,它会回滚我在第二个事务处理方法中保存的内容吗?

java spring transactions spring-boot

2
推荐指数
2
解决办法
3445
查看次数

为什么发生RuntimeException时事务不回滚?

当内部方法分别是事务性的时,我想在服务层测试非事务性方法。我想知道如果某个方法抛出异常会发生什么。它是否正确回滚?我也尝试过rollbackFor,但没有帮助。有什么建议么?

  • 春季 v-2.5.1

应用程序属性

spring.datasource.url=jdbc:mysql://localhost:3306/test
spring.datasource.username=root
spring.datasource.password=root

spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect
spring.jpa.hibernate.ddl-auto=create-drop

server.error.include-message=always
server.error.include-binding-errors=always
Run Code Online (Sandbox Code Playgroud)

控制器

spring.datasource.url=jdbc:mysql://localhost:3306/test
spring.datasource.username=root
spring.datasource.password=root

spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect
spring.jpa.hibernate.ddl-auto=create-drop

server.error.include-message=always
server.error.include-binding-errors=always
Run Code Online (Sandbox Code Playgroud)

服务

@PostMapping("/test")
    public void test(){
        service.test();
    }
Run Code Online (Sandbox Code Playgroud)

java spring spring-data-jpa spring-boot

2
推荐指数
1
解决办法
3961
查看次数

在一个方法调用中在 JPA 中创建两个单独的事务

我有以下案例:

  1. 开始交易
  2. 获取对象A
  3. 更新A
  4. 提交交易
  5. 与 A 一起执行一项长期任务
  6. 更新A(在事务中不是必需的,但它会很好)

如何做到这一点?我不想在步骤 5 期间锁定表。步骤 1-4 的行为应类似于“SELECT FOR UPDATE”。下面是我当前的代码。我正在执行的方法是execute()。我通过从不同的应用程序实例执行它来测试它,并检查实例 A 是否能够在实例 B 执行executeJob(job)时对表执行操作。

@Service
@Slf4j
@Transactional
public class JobExecutionService {

    private final Environment environment;
    private final TestJobRepository testJobRepository;
    private final TestJobResultRepository testJobResultRepository;

    @Autowired
    public JobExecutionService(Environment environment, TestJobRepository testJobRepository, TestJobResultRepository testJobResultRepository) {
        this.environment = environment;
        this.testJobRepository = testJobRepository;
        this.testJobResultRepository = testJobResultRepository;
    }

    public void execute() {
        TestJob job = getJob();
        executeJob(job);
        finishJob(job);
    }

    @Transactional
    public TestJob getJob() {
        TestJob testJob …
Run Code Online (Sandbox Code Playgroud)

java spring hibernate jpa spring-transactions

0
推荐指数
1
解决办法
3264
查看次数