1. 程式人生 > >springMVC的controller中insert()多次,記優惠券被多次領取

springMVC的controller中insert()多次,記優惠券被多次領取

校驗 syn https gmv list spring 源代碼 null tro

做活動,要發優惠券,規定一人只能領取一次(一張)。一天下來發現有一個客戶領到了4張,且是同一秒生成的,源代碼如下:

技術分享圖片

估計多個線程同時進了add方法。

想到了單例的雙重校驗,現修改代碼如下,

    public Object activityTicketAdd(String token,String activityName) {
        Customer customer = getCustomer(token) ;
        Ticket ticket = new Ticket();
        ticket.setCustomerId(customer.getId());
        ticket.setFrom(activityName);
        
if(ticketsDao.queryList(ticket,null,null).size()<=0) { synchronized (this) { if (ticketsDao.queryList(ticket, null, null).size() <= 0) { return ticketService.addTicket(customer, activityName); } } } return
"REPEAT"; }

參考(單例模式中的雙重校驗鎖):https://www.cnblogs.com/diaoniwa/p/7299746.html

同時查看synchronized(this/class) 的區別:https://www.cnblogs.com/huansky/p/8869888.html

springMVC的controller中insert()多次,記優惠券被多次領取