后端代码加了单用户锁,用户处理订单重复提交,进入锁以后,采用entityframework的事务开启事务,事务里面库存,余额等的判断,保存订单主表和订单商品子表,同时去操作商品规格的库存,用jmeter 做并发测试,500线程并发操作,事务平均执行时间在5-6s之间,事务并发期间前台刷新巨慢,事务并发完成,前台也能刷新出来了,有相关经验的能给指出是哪的原因吗,事务并发会锁住整张表吗,其中事务操作的账户表加了行版本,按说应该是锁行级数据,怎么会导致其他数据查询不出呢?通过代码排除,发现最后影响性能的地方就是并发减库存和订单保存的代码,我想要的效果是事务并发不影响前台的查询操作,前台可以正常操作,如何解决此问题,求大神支招?
自己解决了
怎么解决的?
用乐观锁别用事物,举个例子比如你查A表xx货物XX件,然后他购买是吧,然后再查一次A表XX货物XX件,如果与第一次相同,那就提交修改,如果不同,请用户刷新下数量,不过这样有缺点用户体验不好很好,不过也可以解决就是自己循环任务一下1秒查一下循环3次,给用户界面展示效果为订单提交中,其实发生事情是查表,提交前再查表,再提交
不是个好办法,多业务逻辑保持操作一致性,不能每个逻辑都这样判断吧
@狼性法则: 你会用RabbitMQ?会用这个也可以解决
@小小咸鱼YwY: 要想用这个RabbitMQ,我完全可以用redis队列去做,用队列就得引入及时消息通知的插件,客户端需要及时返回消息
事务并发锁住表示数据库级别的锁的关系,要看数据库是什么级别的锁,在代码里面加锁,跟数据库的锁是两码事
数据库加的是行锁,直接按Id查询,单条记录阻塞,其他可以访问
@狼性法则: 数据库的隔离级别是什么等级的
@不知道风往哪儿吹: 数据库都是加的行锁
@狼性法则: 隔离级别会影响锁,锁是隔离级别的具体实现,要看你设置的隔离级别是什么,有可能影响锁的实现
查询一般来说不会影响的。
一般是多个操作方面的东西才会互相影响。
查询非锁定行无影响
@狼性法则: 对对,如果是sqlserver是系统是可以到行,到索引,所以你查询一个是条件上做控制,还有如果只是查询可以考虑with(nolock)
刚才查了一下,可以设置隔离级别也可以处理你说的情况。