public class OperationTestService implements OperationTest {
@Autowired
private OperationPriceMapper operationPriceMapper;
@Autowired
private DataSourceTransactionManager dataSourceTransactionManager;
@Autowired
private TransactionDefinition transactionDefinition;
/**
* 获取 CPU 核心数
*/
int corePoolSize = Runtime.getRuntime().availableProcessors();
private final ThreadPoolExecutor executor = new ThreadPoolExecutor(corePoolSize, 100, 30, TimeUnit.SECONDS, new ArrayBlockingQueue<>(500), new ThreadPoolExecutor.CallerRunsPolicy());
public void excelImp() {
//读取excel中的数据并添加到list中
List<OperationPrice> list1 = new ArrayList<>();
List<OperationPrice> list2 = new ArrayList<>();
List<OperationPrice> list3 = new ArrayList<>();
EasyExcel.read("D:\\DELL\\Documents\\WXWork\\1688856128511192\\Cache\\File\\2024-03\\demo1.xlsx",
OperationPrice.class, new PageReadListener<OperationPrice>(list1::addAll)).sheet().doRead();
EasyExcel.read("D:\\DELL\\Documents\\WXWork\\1688856128511192\\Cache\\File\\2024-03\\demo2.xlsx",
OperationPrice.class, new PageReadListener<OperationPrice>(list2::addAll)).sheet().doRead();
EasyExcel.read("D:\\DELL\\Documents\\WXWork\\1688856128511192\\Cache\\File\\2024-03\\demo3.xlsx",
OperationPrice.class, new PageReadListener<OperationPrice>(list3::addAll)).sheet().doRead();
AtomicBoolean commit = new AtomicBoolean(true);
CyclicBarrier barrier = new CyclicBarrier(3);
executor.execute(() -> {
TransactionStatus status = dataSourceTransactionManager.getTransaction(transactionDefinition);
try {
//插入数据
operationPriceMapper.insertBatch(list1);
//异常
int i = 1 / 0;
} catch (Exception e) {
//如果异常就把事务提交设置false
commit.set(false);
} finally {
try {
//线程进入屏障点,后面的程序将不会执行,直到所有线程都进入这个屏障点一起执行
barrier.await();
} catch (Exception e) {
}
//判断是否提交事务
if (commit.get()) {
dataSourceTransactionManager.commit(status);
} else {
dataSourceTransactionManager.rollback(status);
}
}
});
executor.execute(() -> {
TransactionStatus status = dataSourceTransactionManager.getTransaction(transactionDefinition);
try {
operationPriceMapper.insertBatch(list2);
} catch (Exception e) {
commit.set(false);
} finally {
try {
barrier.await();
} catch (Exception e) {
}
if (commit.get()) {
dataSourceTransactionManager.commit(status);
} else {
dataSourceTransactionManager.rollback(status);
}
}
});
executor.execute(() -> {
TransactionStatus status = dataSourceTransactionManager.getTransaction(transactionDefinition);
try {
operationPriceMapper.insertBatch(list3);
} catch (Exception e) {
commit.set(false);
} finally {
try {
barrier.await();
} catch (Exception e) {
}
if (commit.get()) {
dataSourceTransactionManager.commit(status);
} else {
dataSourceTransactionManager.rollback(status);
}
}
});
}
多线程插入数据保证所有线程的事务一致性
于 2024-03-15 13:26:08 首次发布