imooc-c7-spring-dtx-msg-driven代码提问

来源:1-1 导学-分布式事务实践

qq_大飞_dhsH23

2019-03-02

imooc-c7-spring-dtx-msg-driven\ticket\src\main\java\com\imooc\example\ticket\dao\TicketRepository.java,
@Modifying
@Query(“UPDATE ticket SET lockUser = ?1 WHERE lockUser is NULL and ticketNum = ?2”)
int lockTicket(Long customerId, Long ticketNum);
改成
@Query(“UPDATE ticket SET lockUser = ?1 where lockUser is NULL and owner is NULL and ticketNum =?2”)
会不会好些呢,我用jmeter测试这段代码并发的时候,好像没有锁住票

写回答

1回答

大漠风

2019-03-09

jmeter并发测试,是测试的接口,肯定是在事物里执行的,这个modify的标签,是spring data需要的,不加的话,默认的query的方法表示这个方法是只读的,就会报错。但是这个也跟你其他地方的设置有关。
再说这个有没有锁住,没锁住的表现是什么?你测试的接口的参数是什么样的?

0
1
qq_大飞_dhsH23
会有多条订单生成,我测试流程是这样的,用jmeter在order服务(/api/order)发起了一个订单( "ticketId":"xxx", "title":"xxx", "amount": 150),并发是20个请求,1秒并发10个, 触发后会发送订单创建消息(order:new),在接收消息的时候,发起锁票服务(TicketService -> ticketRepository.lockTicket),即调用了如上这条sql. 结果没锁上,会有多条订单生成,后来我补加上了 where owner is NULL 才没有问题,我觉得可能的情况是: 前面的请求已经锁票成功,并且已经成功下单(更新了 owner 字段,同时也会清空lockUser的值), 而这个时候,另外一个请求进来了,它判断到lockUser is null,然后又生成了一张订单,其实这张票已经有owner了
2019-03-10
共1条回复

分布式事务实践,从原理到实例,解决数据一致性

掌握分布式事务实现技术,是架构师必备技能。

1149 学习 · 153 问题

查看课程