多线程update mysql的问题

@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, 不可以在服务端修改数值

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值