Skip to content

afterCommit 再触发事务会死循环 #620

@sunyj-003

Description

@sunyj-003

Please fill it out carefully, or it will be closed.
请认真填写,不然会直接关闭。

Enviroment

JDK Version(required): 17

SpringBoot Version(required): 2.7.18

dynamic-datasource-spring-boot-starter Version(required):4.3.0

druid Version(optional):

Describe what happened

使用@DSTransactional发生死循环,代码如下
image

package com.baomidou.samples.druid.test;

import com.baomidou.samples.druid.DruidApplication;
import com.baomidou.samples.druid.service.impl.TxService;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;

import javax.annotation.Resource;

/**
 * @author sunyj
 * @date 2024/1/14 20:42
 */
@SpringBootTest(classes = DruidApplication.class)
public class TxTest {
    @Resource
    private TxService txService;

    @Test
    public void testTx() {
        txService.tx();
    }
}

package com.baomidou.samples.druid.service.impl;

import com.baomidou.dynamic.datasource.annotation.DSTransactional;
import com.baomidou.dynamic.datasource.tx.TransactionContext;
import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Service;
import org.springframework.transaction.support.TransactionSynchronization;

import javax.annotation.Resource;

@Service
public class TxService {

    @Lazy
    @Resource
    private TxService txService;

    @DSTransactional
    public void tx() {
        System.out.println("method tx");

        TransactionContext.registerSynchronization(new TransactionSynchronization() {
            @Override
            public void afterCommit() {
                txService.txAfterCommit();
            }
        });
    }

    @DSTransactional
    public void txAfterCommit() {
        System.out.println("method txAfterCommit");
    }
}

使用 @transactional , afterCommit只会调用一次, 代码如下

image
package com.baomidou.samples.druid.test;

import com.baomidou.samples.druid.DruidApplication;
import com.baomidou.samples.druid.service.impl.TxService;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;

import javax.annotation.Resource;

/**
 * @author sunyj
 * @date 2024/1/14 20:42
 */
@SpringBootTest(classes = DruidApplication.class)
public class TxTest {
    @Resource
    private TxService txService;

    @Test
    public void testTx() {
        txService.tx();
    }
}

package com.baomidou.samples.druid.service.impl;

import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.transaction.support.TransactionSynchronization;
import org.springframework.transaction.support.TransactionSynchronizationManager;

import javax.annotation.Resource;

@Service
public class TxService {

    @Lazy
    @Resource
    private TxService txService;

    @Transactional
    public void tx() {
        System.out.println("method tx");

        TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronization() {
            @Override
            public void afterCommit() {
                txService.txAfterCommit();
            }
        });
    }

    @Transactional
    public void txAfterCommit() {
        System.out.println("method txAfterCommit");
    }
}

Expected Result:
和Spring的一致

Actual Result:
死循环

If there is an exception,or aop invalid,please attach the exception trace:


Steps to reproduce

  • Step 1

  • Step 2

  • Step 3

Metadata

Metadata

Assignees

Labels

No labels
No labels

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions