@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
public class JunitTest {
@Autowired
private ProduceOrderRepository p;
@Autowired
private ShopCartTest s;
@Autowired
private TaskExecutor t;
CountDownLatch status = new CountDownLatch(2);
@Test
public void test1() {
t.execute(new InnerThread());
t.execute(new InnerThread());
try {
status.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
class InnerThread implements Runnable {
@Override
public void run() {
s.add();
status.countDown();
}
}
}
@Service
public class ShopCartTest {
@Autowired
private ShopCartRepository shopcartRepository;
public void add() {
ShopCartDto shopCartDto = shopcartRepository.getByUserIdAndSpecId(334l, 266l);
try {
TimeUnit.SECONDS.sleep(2);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
shopCartDto.setQuantity(shopCartDto.getQuantity() + 1);
shopcartRepository.save(shopCartDto);
System.out.println("%%%%%%%%%%%%%%%");
}
}
先select, 根据查的结果修改实体, 然后再save, 多线程执行会发生数据异常. 对此改用update语句来修改
即, 以db中原有数值为基础进行修改数据时, 必须利用db直接对原数据update, 不可以在服务端修改数值