- @Override
- @Transactional(rollbackFor = Exception.class)
- public void batchSaveOrUpdate(List<TblClassStudent> classStudents) {
- if(CollectionUtils.isEmpty(classStudents)) {
- return;
- }
- classStudents.forEach(classStudent -> {
- this.getBaseMapper().saveOrUpdate(classStudent);
- try {
- // 为了方便复现问题,睡眠1秒
- TimeUnit.SECONDS.sleep(1);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- });
- }
- // 单元测试
- @Test
- public void batchSaveOrUpdateTest() throws InterruptedException {
- TblClassStudent classStudent = new TblClassStudent();
- classStudent.setId(1);
- classStudent.setClassNo("20231010");
- classStudent.setStudentNo("20231010201");
- TblClassStudent classStudent1 = new TblClassStudent();
- classStudent1.setId(2);
- classStudent1.setClassNo("20231010");
- classStudent1.setStudentNo("20231010202");
- List<TblClassStudent> classStudents1 = new ArrayList<>();
- classStudents1.add(classStudent);
- classStudents1.add(classStudent1);
- List<TblClassStudent> classStudents2 = new ArrayList<>();
- classStudents2.add(classStudent1);
- classStudents2.add(classStudent);
- // 模拟2个线程,同时批量更新
- CountDownLatch latch = new CountDownLatch(2);
- new Thread(() -> {
- studentService.batchSaveOrUpdate(classStudents1);
- latch.countDown();
- }, "t1").start();
- new Thread(() -> {
- studentService.batchSaveOrUpdate(classStudents2);
- latch.countDown();
- }, "t2").start();
- latch.await();
- System.out.println("主线程执行完毕");
- }