C# 会议室预定

罗汉松驻扎的工作基地 2017-08-27 01:19:13
近来需要做一个会议室预定的功能 , 现在我遇到的问题是 , 多个人同时预定一个会议室的时候 , 会出现同时成功预定的问题 , 应该是我的lock没有写好 , 各路大侠 , 有么有比较好的参考例子和书籍可以介绍????

菜鸟一只 , 求组
...全文
397 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
xian_wwq 2017-08-28
  • 打赏
  • 举报
回复
引用 楼主 MFCdestoryer 的回复:
近来需要做一个会议室预定的功能 , 现在我遇到的问题是 , 多个人同时预定一个会议室的时候 , 会出现同时成功预定的问题 , 应该是我的lock没有写好 , 各路大侠 , 有么有比较好的参考例子和书籍可以介绍???? 菜鸟一只 , 求组
如果对预定分配效率要求不是非常高, 有个简单方法, 把预定请求放到一个队列中去 对队列加锁, 后台处理线程从队列中读取, 这样就不会出现多个预定成功的问题了
吉普赛的歌 2017-08-27
  • 打赏
  • 举报
回复
用数据库来做就好:
IF OBJECT_ID('dbo.meetingRoom') IS NOT NULL
DROP TABLE dbo.meetingRoom
GO
CREATE TABLE dbo.meetingRoom(
roomId INT IDENTITY(1,1) PRIMARY KEY,
roomName NVARCHAR(50) NOT NULL,
isScheduled BIT NOT NULL DEFAULT(0),			--是否预定
scheduledTime DATETIME NOT NULL DEFAULT(0),		--预定时间
scheduledUsedId INT NOT NULL DEFAULT(0),		--预定人
beginTime DATETIME NOT NULL DEFAULT(0),			--会议开始时间
endTime DATETIME NOT NULL DEFAULT(0)			--会议结束时间
)
--插入一条记录(会议室)
INSERT INTO dbo.meetingRoom(roomName) VALUES('会议室1')

--界面上操作时取出所有未被预定的记录
SELECT * FROM dbo.meetingRoom WHERE isScheduled=0
--roomId = 1 isScheduled=0 scheduledTime='1900-01-01'

--前端选中 roomId = 1 isScheduled = 0 scheduledTime='1900-01-01' 这条记录并将其改为预定状态
--因为更新时数据库会自动锁定这条记录,再多并发只可能有一条记录被更新
--如果 ExecuteNonQuery 的值为0,则前端说明此房间已被预定即可。
UPDATE dbo.meetingRoom
SET isScheduled=1,scheduledTime=GETDATE(),scheduledUsedId=1
WHERE roomId = 1
AND isScheduled = 0

--会议室用完,自动将更新为可预定
UPDATE dbo.meetingRoom
SET isScheduled=0,scheduledTime='1900-01-01'
WHERE  isScheduled=1 AND endTime<GETDATE()

--如果想完全不用数据库, 其实思路也是可以借鉴的,lock 之后取 list 中的 未被预定的 记录, 
--如果取不到就说明被人抢定了。
xuzuning 2017-08-27
  • 打赏
  • 举报
回复
与 lock 无关,lock 只是防止同时操作,并不是排他性的 应该是:如果已经预定掉了,则表示预定失败

110,535

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧