@RunWith(SpringRunner.class)
@SpringBootTest(classes = WebApplication.class)
@EnableAutoConfiguration
public class SpringBootTest {
@Autowired
@Qualifier("threadPoolWorkRule")
private ThreadPoolTaskExecutor fixedThreadPool;
@Autowired
private PlatformTransactionManager transactionManager;
@Autowired
private LogMapper logMapper;
@Test
@Rollback(value = false)
@Transactional
public void TestCountDownLatch() {
ExecutorService executorService = Executors.newFixedThreadPool(3);
CountDownLatch cdl = new CountDownLatch(3);
// 是否存在异常
AtomicReference<Boolean> isError = new AtomicReference<>(false);
genTx(cdl, isError);
try {
cdl.await();
System.out.println("三个执行线程结束");
} catch (InterruptedException e) {
e.printStackTrace();
System.out.println("执行线程异常");
} finally {
executorService.shutdown();
System.out.println("执行线程关闭");
}
}
/**
* 异常测试
*
* @param finalNum
*/
public void function(int finalNum) {
System.out.println("方法" + finalNum);
int a = 10 / finalNum;
// 记录日志
DocumentLog documentLog = new DocumentLog ();
documentLog.setDocumentNo("1-1-1-1-1-1");
documentLog.setRemark(finalNum + "");
logMapper.insert(documentLog);
}
public void genTx(CountDownLatch cdl, AtomicReference<Boolean> isError) {
for (int i = 0; i < 3; i++) {
int finalNum = i;
fixedThreadPool.submit(() -> {
DefaultTransactionDefinition def = new DefaultTransactionDefinition();
def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRES_NEW);
TransactionStatus status = transactionManager.getTransaction(def);
try {
function(finalNum);
} catch (Exception e) {
isError.set(true);
e.printStackTrace();
} finally {
cdl.countDown();
}
try {
cdl.await();
// 所有线程一起提交事物
if (isError.get()) { // 事务回滚
transactionManager.rollback(status);
} else { //事务提交
transactionManager.commit(status);
}
} catch (InterruptedException e) {
e.printStackTrace();
}
});
}
}
}
CountDownLatch子线程事务提交与回滚
最新推荐文章于 2023-12-17 14:55:45 发布