每次写博客,第一句话都是这样的:程序员很苦逼,除了会写程序,还得会写博客!
当然,题外话说多了,咱进入正题!
在处理大数据的时候,经常会发生并发,并发的情况发生后,会出现数据污读,从而产生脏数据。
首先通过一段程序进行说明、<有兴趣的小伙伴可以复制粘贴这段程序>。
项目背景:模拟大转盘抽奖程序。
场下坐有近万名群众,他们在同一时刻同时抽奖,奖品分为一等奖:奔驰汽车10辆,二等奖:别克汽车20辆,三等奖:现代汽车30辆。(奖品信息存入数据库)
奖品信息如下(数据库部分):
create table JP_test
(
Id int identity(1,1),
JpLeave int,--奖品等级
JpName nvarchar(50),--奖品名称
jpCount int,--奖品数量
)
insert into JP_test values(1,'奔驰汽车',10)
insert into JP_test values(2,'别克汽车',20)
insert into JP_test values(3,'现代汽车',30)
update JP_test set jpCount=10 where JpLeave=1
update JP_test set jpCount=20 where JpLeave=2
update JP_test set jpCount=30 where JpLeave=3
--以上SQL语句大家看懂表示没压力。在此不作讲解。
程序思路:通过开辟线程进行模拟操作,一个线程代表一个群众,由于群众近万人,我们暂且开辟十个线程并通过FOR循环进行模拟!
条件判断:当数据库中一等奖数据小于1时,不再进行一等奖的抽奖工作,也就是不再进行针对一等奖数量的减少工作。同理二等奖,三等奖。
最后输出抽奖后的一等奖,二等奖,三等奖数量。
按照我们的设计思路,很显然最后的答案应该为:一等奖,二等奖,三等奖数量都为0,真实情况是否如此?请看下面代码。
模拟代码如下:
T_SQL代码如下:
下面我们看看程序执行的结果(因为近万名群众同时抽奖,同时与数据库进行交互,所以程序运行会占用15秒左右的时间,请大家耐心等待):

呵呵:最后一等奖,二等奖的数量都变成了负数(当然三等奖也可能为负数)!如果这个活动是公司年会抽奖,那么你注定不好过年了!哈哈哈!
究其原因,就是咱们在操作数据库的时候,没有进行并发处理。有兴趣的小虎伴们也可以尝试: Thread td1 = new Thread(choujiang);进行操作!在此就不作演示了!
至此本篇博客的任务就算完成了,模拟并发咱们也做到了!程序写的比较简单丑陋,欢迎大家积极改善发言!