设为首页 收藏本站
查看: 830|回复: 1

[经验分享] 真人真事改編-訂票系統問題解決實戰

[复制链接]
累计签到:91 天
连续签到:1 天
发表于 2016-8-10 11:46:24 | 显示全部楼层 |阅读模式
转一个本ID认为不错的项目给大家看看,来源https://www.facebook.com/groups/222546864546011/

用waitfor delay '00:00:01.50'来摸拟DB慢时会出现超卖的情况
为了解决这个超卖的问题加入對超賣的判斷:

在"可用票量"表中加一個字段用來記錄已售票量
create table 可用票量
(ticket_id        int identity primary key, --代號

event_code        nvarchar(36) not null unique, --活動代碼
event_name nvarchar(125), --活動名稱
event_amt int --可用量
event_buy int --已售量
)
go
DECLARE @dml TABLE
( before varchar(10),
after varchar(10)
)
然后在[USP_索票]的存儲過程中加入是否超賣的判斷,如超賣就rollback
update [dbo].[可用票量] set [event_buy] = [event_buy]+@request_ticket
OUTPUT deleted.event_buy,inserted.event_buy into @DML
where event_code=@event_code
if (SELECT [after] FROM @dml)>@total_ticket
begin
rollback transaction
return
end






该项目是设计一个简单的订票系统,SQL如下:
--HKDB是一个空的DB
use HKDB
go
--0可用 1已用
drop table if exists 索票記錄
if exists(select * from sys.tables where name='索票記錄') drop table 索票記錄;
drop table if exists 可用票量
if exists(select * from sys.tables where name='可用票量') drop table 可用票量;
drop proc  if exists [USP_索票]
if exists(select * from sys.objects where name='USP_索票') drop proc USP_索票;
go
--可用票資料表
create table 可用票量
(ticket_id                int identity primary key, --代號  
event_code                nvarchar(36) not null unique, --活動代碼
event_name     nvarchar(125), --活動名稱
event_amt      int --可用量
)
go
--新增驗證票
insert into 可用票量(event_code,event_name,event_amt)
select '20160805001','售票範例之簡易版',400
go
--------------------------------
--可用票量-->APP--PROC-->索票記錄--
--------------------------------

--訂購票記錄資料表
create table 索票記錄
(reserve_id                int identity        primary key, --索票記錄
event_code                nvarchar(36) references 可用票量(event_code), --活動代碼
reserve_amt        int ,        --索票數量
reserve_for        nvarchar(36) --索票人員
)
go
----------------------------------------
--建立預存程序,根據活動代碼、使用者索取指定票量
-----------------------------------------
create proc [dbo].[USP_索票]
    --活動代碼                   --索票人員
        --索票數量                   --可用量
    @event_code nvarchar(36),        @user_name nvarchar(20),
        @request_ticket int     ,        @total_ticket int
AS
begin try
begin transaction
    SET TRANSACTION ISOLATION LEVEL REPEATABLE READ  
        declare @sale_ticket int  --已經賣出量
        declare @free_ticket int  --計算可用量
        set     @sale_ticket = (select isnull(sum(reserve_amt),0)
                                from 索票記錄 where event_code=@event_code)       
        --可能發生資料庫緩慢       
        waitfor delay '00:00:01.50'
        if      @sale_ticket >= @total_ticket                 --已經超賣
                set @free_ticket= 0
        else if @sale_ticket+@request_ticket <= @total_ticket --數量足夠
                set @free_ticket = @request_ticket
        else
                set @free_ticket = @total_ticket-@sale_ticket     --省下零星
    --新增索票記錄資訊
        insert 索票記錄(event_code,reserve_amt,reserve_for)
        values (@event_code,@free_ticket,@user_name)

        select (@sale_ticket+@free_ticket) as [已取量],@free_ticket as [可用量]
commit transaction
end try
begin catch
  rollback transaction
  ;throw
end catch
GO

--驗證--
select * from 可用票量
select * from 索票記錄

select sum(reserve_amt) as [已經賣出量],
       isnull(sum(reserve_amt),0) as [已經賣出量處理NULL]
from 索票記錄

declare @code nvarchar(36)='20160805001'
declare @total int = (select event_amt
                      from 可用票量 where  event_code= @code)
exec [dbo].[USP_索票] @event_code= @code ,@user_name='LEWIS',
                     @request_ticket=2 , @total_ticket=@total


select * from 可用票量
select * from 索票記錄



訂票系統問題解決實戰 - 初階.zip

41.97 KB, 下载次数: 0

訂票系統進階導讀-出處楊老師書籍.pdf

335.58 KB, 下载次数: 0


运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-255824-1-1.html 上篇帖子: INT與BIGINT的使用時機 下篇帖子: 從 SQL Server 到 MariaDB - [1] 備份與還原
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表