手抄报 安全手抄报 手抄报内容 手抄报图片 英语手抄报 清明节手抄报 节约用水手抄报

订单系统流程

时间:2025-01-04 18:49:32

1、在订单表生成订单。(status为0表示未支付,status为1表示已支付)粘址地鲥鲣剔墟栏mrw.so/2LTLqB例如:表 bill数据 {"id":"1"荑樊综鲶,"amount":"100","status":"0","time":"2017-10-23 15:00:00"}

订单系统流程
订单系统流程

2、点击支付,开启事务,嚼但匙噻首先查询订单粘址地栏mrw.so/2LTLqB例如:begin transaction;s髫潋啜缅elect * from bill where id = 1 for update;此次使用for update锁定这条记录,并防止其他回话进入订单操作流程

订单系统流程

3、支付后变更支付状态,并插入流水记录粘址地栏mrw.so/2LTLqBupdate bill set status = 1 where id = 1;后续的插入操作

订单系统流程

4、结束事务。(注意:在上面流程中有失败的情苄念上妒况必须进行rollback,退出事务,防止持续加锁或者数据长时间未提交,可以使用try catch)粘址地栏mrw.so/2LTLq蚱澄堆别Bcommit;end transaction;

订单系统流程

5、关于订单系统重复点击支付流程。

6、在1号会话进入订单支付流程时候,会进行select * from bill where id = 1 for update;锁定记录操作。

订单系统流程

7、2号会话在此同时进入select * from bill where id = 1 for update;锁定记录,首先必须等待1号会话提交或者回滚,因为1号会话已经对此订单加持行锁。

订单系统流程

8、1号会话完成订单的事务操作,将status从0变为1。

订单系统流程

9、2号会话成功进行select * from bill where id = 1 for update;并查出status的状态为1,已经已经支付。

订单系统流程

10、2号会话进行一次rollback操作,因为此订单已经完成。rollback操作将释放for update的锁定,不然整行记录会一直加持行锁,导致后续的死锁出现。

订单系统流程
© 手抄报圈