-
Notifications
You must be signed in to change notification settings - Fork 1.2k
Closed
Description
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
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只会调用一次, 代码如下

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