前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >sql serve2008是否自带互斥锁

sql serve2008是否自带互斥锁

作者头像
forxtz
发布2020-10-10 16:35:44
发布2020-10-10 16:35:44
41000
代码可运行
举报
文章被收录于专栏:源懒由码源懒由码
运行总次数:0
代码可运行

近期突然想到,一道珠海笔试题,让你写atm机的逻辑,当时想多了,以为重点是让你写清楚其中的事务互斥关系,当时也忘记数据库是否会自动互斥,从而不会出现脏数据。所以就敲了个代码实践了下。

例子还是老例子.....卖票..不会卖出脏数据为好。

线程函数:

代码语言:javascript
代码运行次数:0
运行
复制
static DWORD WINAPI Ticket1(LPVOID lp)
{
	while(1){
		  try{
			    CppSQLDB db;
    //获取不是0则卖出
			    string s = "select * from Ticket";
			    db.ExectueQuery(s);
			    if(db.Eof())
				      return false;
			    int ticket;
			    db.GetIntValue("ticket",ticket);
			    if(ticket>0){
				      s = "update Ticket set ticket = ticket - 1";
				      if(db.ExecuteDML(s))
				      cout << "ticket 1 sale "<< tickets-- <<endl;
			    }else{
				      break;
			    }
		  }catch(_com_error& e){
			      cout << "error 1 "<< e.Description() << endl;
		     }
	  }
	  return 1;
}

当在多线程/进程的情况下,很容易想到,如果再某一时间,同时获取数据库得到票数为1,那么就可能卖出脏票,然而实际上通过sql中的触发器可以实现不会卖脏票,反之可以得出,数据库对一些更新的事务,会智能处理(应该是加锁),不会出现在某个时刻,同时执行了两次 ticket = ticket -1 而导致 ticket 只减少了一张,而卖出脏票。

代码语言:javascript
代码运行次数:0
运行
复制
CREATE trigger ticketTri on Ticket 
for update  
as  
begin  
     IF EXISTS(select * from Deleted where ticket < 1)  
   begin  
        print 'least';  
        rollback;  
   end  
end
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2015-08-07 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档