亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > 綜合 > 正文

使用ServiceBroker自動激活模擬"秒殺"場景

2024-07-21 02:50:40
字體:
來源:轉載
供稿:網友
使用ServiceBroker自動激活模擬"秒殺"場景 2014-03-24 08:49 by JentleWang, ... 閱讀, ... 評論, 收藏, 編輯 1.簡介

  SQL Server Service Broker 是SQL server里面比較獨特的一個功能。它可幫助開發人員構建異步的松散耦合應用程序

  ServiceBroker入門文章:http://blogs.msdn.com/b/apgcdsd/archive/2012/07/27/sql-server-service-broker-demo.aspx

  ServiceBroker的隊列存在自動激活(ACTIVATION)功能,其中內部激活可以激活數據庫存儲過程接受和處理隊列的消息,而且可以啟動激活存儲過程的多個實例(MAX_QUEUE_READERS)。當SQLServer的SCHEDULER個數大于1(即多CPU)時,會有多個實例同時去接受并處理消息。

  所以,接下來以發送出庫消息,接受并更新庫存為例,模擬并發條件下的庫存檢查及更新過程。

2.實現步驟2.1 創建測試數據庫及表

代碼如下:其中inventory為庫存表,表中兩個字段,產品和庫存數量

use mastercreate database wmsgouse wms gocreate table inventory(    material  int,    quantity  int)
2.2 創建ServiceBroker對象,搭建基礎框架

創建ServiceBroker服務對象,包括消息類型、約定、隊列及服務等。簡化起見,演示程序是運行在同一個數據庫實例下的同一個數據庫中

use wms--創建消息類型create message type inventoryio--創建約定create contract inventory_contract(    inventoryio sent by initiator)--創建客戶端隊列create queue inventory_client_queue--創建客戶端服務create service inventory_client on queue inventory_client_queue;--創建庫存隊列create queue inventoryio_queue--創建庫存更新服務create service inventoryioon queue inventoryio_queue(    [inventory_contract]);

2.3 開啟會話,發送出庫消息
--發送出庫消息begin transaction    declare @dialog_id uniqueidentifier    begin dialog conversation @dialog_id        from service inventory_client        to service 'inventoryio'        on contract [inventory_contract]        with encryption = off;        send on conversation @dialog_id message type  inventoryio        (        '<InventoryUpdate>        <material>1</material>        <quantity>1</quantity>        </InventoryUpdate>'            ); commit transaction;

為了記下來測試并發情況,連續運行上面的代碼四次。發送完后,查詢目標服務的隊列

select * from inventoryio_queue

結果如下:

2.4 創建庫存更新的存儲過程

接下里創建存儲過程,該存儲過程接受隊列的出庫指令,檢查庫存,當庫存滿足時,更新庫存;庫存不足時,回滾事務,消息重新回到隊列

代碼如下:

create PRoc InventoryProc asbegin transaction    declare @dialog_id uniqueidentifier    declare @message_body xml    declare @quantity int;    declare @material int;        waitfor(    receive        @dialog_id = conversation_handle,        @message_body = message_body     from [dbo].inventoryio_queue),timeout 5000;        if(@dialog_id is not null)    begin         set @quantity = @message_body.value('(/InventoryUpdate/quantity)[1]','int');        set @material = @message_body.value('(/InventoryUpdate/material)[1]','int');        --檢查庫存是否足夠        if exists( select 1 from inventory where  material = @material and quantity>=@quantity)        begin             print 'come here'            --更新庫存            Update inventory set quantity =quantity-@quantity where material = @material;        end        else         begin             rollback            return        end     end    end conversation @dialog_id; commit transaction; go
2.5 修改隊列,啟用自動激活功能

啟用隊列的自動激活功能,激活的存儲過程為上面創建的存儲,設置最大讀取器個數為5.

ALTER QUEUE [dbo].[inventoryio_queue] WITH STATUS = ON , RETENTION = OFF , ACTIVATION (  STATUS = ON , PROCEDURE_NAME = [dbo].[InventoryProc] , MAX_QUEUE_READERS = 5 , EXECUTE AS N'dbo'  ), POISON_MESSAGE_HANDLING (STATUS = OFF) 

注意:

POISON_MESSAGE_HANDLING的設置必須為OFF,將有害消息處理設置為 OFF 的隊列在五個連續的事務回滾之后不會被禁用。否則默認為ON,隊列在回滾5次后,會被禁用啟用自動激活后,可以查看目前激活的實例select * from sys.dm_broker_activated_tasks
2.6 插入庫存,查看更新結果
insert into inventoryvalues(1,1)select * from inventoryio_queueselect * from inventory

結果如下:

可以看到隊列中已經沒有消息了,庫存數量已經減少,但更新結果不準確.原因是在更新庫存之前,多個存儲過程實例都讀取了庫存數,并判斷出庫存滿足,然后對庫存進行了更新。注:最終庫存數量不一定為-3,需視Scheduler數量以及同時有多少個存儲過程實例可以獲得CPU來執行有關解決方法: 一種是設置隊列的自動激活的最大實例數為1,即不允許并發讀取另外就是在讀取庫存時,增加提示 with(holdlock),這樣只允許一個實例讀取庫存表的一行數據,直到事務結束。可查閱這篇文章:http://www.cnblogs.com/buaaboyi/archive/2011/08/30/2159860.html代碼如下:
--檢查庫存是否足夠        if exists( select 1 from inventory with(holdlock) where  material = @material and quantity>=@quantity)
3. 總結

本文演示了一個ServiceBroker單數據庫的簡單實例,并介紹了自動激活機制。簡單涉及了SQLServer的CPU調度。同時,提及了SQLServer的 with(holdlock)提示

注:本文代碼僅供演示使用而非實際應用于生產環境。如有問題及建議,請指正!^_^

參考文章:http://www.cnblogs.com/markj/archive/2013/03/31/2991777.html


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
91国语精品自产拍在线观看性色| 亚洲精品99久久久久中文字幕| 亚洲成人三级在线| 国语自产精品视频在线看一大j8| 亚洲视屏在线播放| 久久久免费观看视频| 亚洲午夜色婷婷在线| 久久国产精品久久久久| 国模精品一区二区三区色天香| 欧美老女人xx| 国产精品国产亚洲伊人久久| 国产午夜精品美女视频明星a级| 欧美亚洲成人精品| 亚洲精品99久久久久中文字幕| 亚洲精品在线不卡| 精品无人国产偷自产在线| 日韩视频在线免费观看| 日韩欧美国产中文字幕| 尤物精品国产第一福利三区| 国产精品狼人色视频一区| 国产伦精品免费视频| 亚洲欧美日韩在线高清直播| 精品国产31久久久久久| 欧洲亚洲妇女av| 一个人看的www欧美| 国产成人亚洲综合91精品| 精品国产乱码久久久久久虫虫漫画| 2019中文字幕全在线观看| 久久97精品久久久久久久不卡| 最近免费中文字幕视频2019| 国产精品va在线播放| 在线亚洲欧美视频| 欧美亚洲成人免费| 亚洲精品国产精品国自产观看浪潮| 亚洲欧美中文日韩在线v日本| 国产精品爱久久久久久久| 97av在线影院| 国产精品第3页| 欧美多人乱p欧美4p久久| 欧美激情综合亚洲一二区| 青青久久aⅴ北条麻妃| 疯狂欧美牲乱大交777| 国产精品一区二区久久| 亚洲欧美激情四射在线日| 中文字幕国内精品| 中文字幕在线成人| 亚洲第一网中文字幕| 久久久99免费视频| 欧美日韩第一视频| 欧美色videos| 久久综合伊人77777蜜臀| 欧美性极品少妇精品网站| 另类图片亚洲另类| 大伊人狠狠躁夜夜躁av一区| 久久久久久com| 日韩h在线观看| 亚洲石原莉奈一区二区在线观看| 国产精品亚洲第一区| 日本精品免费一区二区三区| 亚洲成人激情在线| 亚洲iv一区二区三区| 美女福利精品视频| 久久久久久97| 欧美一级大片在线免费观看| 久久视频精品在线| 在线亚洲午夜片av大片| 中文字幕日韩在线视频| 亚洲国产精品久久久久| 萌白酱国产一区二区| 欧美视频在线观看免费网址| 日韩av电影手机在线观看| www.xxxx精品| 欧洲成人性视频| 日韩精品免费在线| 欧美成人免费一级人片100| 久久久999精品视频| 久久久久久午夜| 国产一区二区三区日韩欧美| 日韩欧美高清在线视频| 一区二区中文字幕| 大量国产精品视频| 91在线高清视频| 性欧美xxxx交| 日韩在线一区二区三区免费视频| 亚洲图片在线综合| 成人免费淫片aa视频免费| 亚洲a区在线视频| 亚洲精品免费网站| www.亚洲成人| 在线a欧美视频| 狠狠躁夜夜躁人人躁婷婷91| 中文字幕日韩精品有码视频| 91精品国产成人www| 欧美一级淫片丝袜脚交| 欧美大尺度在线观看| 91精品视频在线看| 国产精品大片wwwwww| 2019中文字幕在线观看| 成人午夜两性视频| 亚洲一级黄色av| 国产视频久久久久| 日本欧美一二三区| 国产精品久久久久久中文字| 精品欧美国产一区二区三区| 国产精品福利在线观看网址| 国产精品91久久| 2019中文字幕免费视频| 日韩国产精品亚洲а∨天堂免| 91av在线国产| 亚洲偷欧美偷国内偷| 精品香蕉一区二区三区| 欧美日韩性视频在线| 亚洲一区二区免费在线| 日韩av在线电影网| 日韩久久精品电影| 91情侣偷在线精品国产| 国产小视频91| 亚洲美腿欧美激情另类| 国产日本欧美视频| 欧美成人精品在线观看| 国产91在线高潮白浆在线观看| 日韩成人中文字幕在线观看| 欧美一区二区三区免费观看| 日韩av综合网站| 美日韩精品免费观看视频| 亚洲视频在线观看免费| 国产免费一区二区三区在线能观看| 91精品视频在线播放| 韩国三级日本三级少妇99| 亚洲精品aⅴ中文字幕乱码| 亚洲自拍偷拍网址| 久久久视频免费观看| 成人在线播放av| 欧美精品xxx| 亚洲va电影大全| 国产综合久久久久久| 国产精品综合久久久| 日韩欧美在线网址| 国产极品jizzhd欧美| 国产综合久久久久久| 亚洲淫片在线视频| 国产日韩欧美在线看| 国产精品中文字幕在线| 伦伦影院午夜日韩欧美限制| 黑人巨大精品欧美一区二区免费| 98精品国产自产在线观看| 奇米一区二区三区四区久久| 羞羞色国产精品| 日韩资源在线观看| 2019国产精品自在线拍国产不卡| 91香蕉国产在线观看| 亚洲人成电影网站色…| 伦伦影院午夜日韩欧美限制| 中文字幕自拍vr一区二区三区| 日韩美女免费视频| 欧美在线精品免播放器视频| 97精品免费视频| 亚洲欧美另类自拍| 亚洲国产精品久久久久秋霞不卡| 91精品91久久久久久| 欧美裸体视频网站| 亚洲免费人成在线视频观看| 午夜精品一区二区三区在线| 欧美另类暴力丝袜|