赞
踩
有两种情况。(美团实践)
1.两个用户虽然都可以选,但是一个用户提前提交订单了,开始倒计时。要是过了这个时间座位可选。(虽然还没有买)其他选同一个票的用户就不能预约成功了,后台返回状态,app界面显示预约失败。
2.虽然票没有被买,但是要是别人预约了后就不能选了(座位会显示已选)。
感悟:用户每次访问购票界面的时候,就从后台读取座位。保证当前最新。(别人预约过的票设置不可选状态)
1.如何加锁?两个用户购买同一张电影票如何加锁?解决的问题是防止多个用户选同一张票,同时提交预约订单的发生错误。
2.如何实现预约期限到时,票的信息变为可选?
首先查询票的状态,如果票没有被购买,就可以购买。然后修改数据库信息。如果有购买就给客户端返回预约失败的状态码。
S锁-读锁共享锁,X锁-排它锁-写锁。
https://www.cnblogs.com/baizhanshi/p/6889261.html
https://www.cnblogs.com/running-crusader/articles/6402923.html
加行锁。
select * from tb with(updlock) where col = xxx;将一行数据锁住,其他连接不能再修改表。
应对高并发的解决方案:
1、将压力放在数据库上面,添加行级锁。
select * from table for update;
update
table_name
with
(rowlock)
set
column_name=new_value
where
your_condition;
SELECT ... LOCK IN SHARE MODE(共享锁)
在读取的行上设置一个共享模式的锁。这个共享锁允许其它session读取数据但不允许修改它。 行读取的是最新的数据,如果他被其它事务使用中而没有提交,读取锁将被阻塞,直到那个事务结束。
SELECT ... FOR UPDATE(排他锁)
在读取行上设置一个排他锁。阻止其他session读取或者写入行数据。
2、将压力放在应用程序上面,对方法加synchronized同步。方法为:(先读取下座位的状态,如果状态为售出那么就返回失败,如果状态为可售则修改数据库中的状态为已预定)其他用户不可再选座、预定。为加避免多个线程修改数据库出现的错误。
倒计时后台保存订单过期的时间。app每次获取计算显示倒计时时间,后台通过轮询判断订单失后就使该订单失效,并且该修改票的状态为可售。
共享锁【S锁】
又称读锁,若事务T对数据对象A加上S锁,则事务T可以读A但不能修改A,其他事务只能再对A加S锁,而不能加X锁,直到T释放A上的S锁。这保证了其他事务可以读A,但在T释放A上的S锁之前不能对A做任何修改。
排他锁【X锁】
又称写锁。若事务T对数据对象A加上X锁,事务T可以读A也可以修改A,其他事务不能再对A加任何锁,直到T释放A上的锁。这保证了其他事务在T释放A上的锁之前不能再读取和修改A。
参考:https://blog.csdn.net/yuwei19840916/article/details/3245107
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。