预约电影票并发。

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_34602647/article/details/83180663

有两种情况。(美团实践)

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锁)和排它锁(X锁)

共享锁【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 
 

猜你喜欢

转载自blog.csdn.net/qq_34602647/article/details/83180663
今日推荐