求哪位朋友给我推荐两篇关于并发的文章把我难死的了,谢了!!!今天面试管说:"你们并发是怎么处理的?",我就答了一种消极的解决方案:"操作时,我的代码先看看数据库里面有没有,再决定怎么操作。"他又问:"那同时插入多条数据呢,比如一百个用户同时注册?"我基本上晕了,我想“一百个用户同时注册的时候难道数据库自己不知道该怎么安排先后吗?难道他们会去争抢那个自增的ID吗??”求解??

解决方案 »

  1.   

    我觉得就两条。
    1。防止死锁。
    2。注意多用户操作同表或同表用记录时,注意锁表或锁记录。
    1 如何锁一个表的某一行A 连接中执行SET TRANSACTION ISOLATION LEVEL REPEATABLE READbegin transelect * from tablename with (rowlock) where id=3waitfor delay '00:00:05'commit tranB连接中如果执行update tablename set colname='10' where id=3 --则要等待5秒update tablename set colname='10' where id<>3 --可立即执行2 锁定数据库的一个表SELECT * FROM table WITH (HOLDLOCK) 
    注意: 锁定数据库的一个表的区别SELECT * FROM table WITH (HOLDLOCK) 
    其他事务可以读取表,但不能更新删除SELECT * FROM table WITH (TABLOCKX) 
    其他事务不能读取表,更新和删除
      

  2.   

    锁定记录,只允许单用户修改的例子create table #锁表(编号 int)--代码:
    if exists(select 1 from 编号='你的编号') 
      returninsert #锁表 values('你的编号').....你处理的代码delete #锁表 where 编号='你的编号'
    --------------------------------------
    --为了防止死锁,建议加时间:create table #锁表(编号 int,时间 datetime)--代码:
    if exists(select 1 from 编号='你的编号' and datediff(ss,时间,getdate())<5  --如果锁的时候超过5秒,则是处理超时

      returndelete from #锁表
    insert #锁表 values('你的编号',getdate()).....你处理的代码delete #锁表 where 编号='你的编号'
    ---------------------------------------
    --锁定记录,只允许单用户修改的例子:--创建测试环境
    --创建测试表--部门表
    create table 部门(departmentid int,name varchar(10))--记录锁定表
    create table lock(departmentid int,dt datetime)go
    --因为函数中不可以用getdate,所以用个视图,得到当前时间
    create view v_getdate as select dt=getdate()
    go
    --创建自定义函数,判断记录是否锁定
    create function f_chk(@departmentid int)
    returns bit
    as
    begin
    declare @re bit,@dt datetime
    select @dt=dt from v_getdate
    if exists(select 1 from lock where departmentid=@departmentid
    and datediff(ss,dt,@dt)<5)
    set @re=1
    else
    set @re=0
    return(@re)
    end
    go--数据处理测试
    if dbo.f_chk(3)=1
    print '记录被锁定'
    else
    begin
    begin tran
    insert into lock values(3,getdate())
    update 部门 set name='A' where departmentid=3
    delete from lock where departmentid=3
    commit tran
    end--删除测试环境
    drop table 部门
    drop view v_getdate
    drop function f_chk
      

  3.   

    http://www.cnblogs.com/zhenyulu/articles/330494.html
      

  4.   


    我sql比较菜!!
    create table #锁表(编号 int) 这个不是创建表的语法吗??
    "#锁表" 是什么意思啊???
      

  5.   

    Read committed 和Serializable 你要考虑你所能接收的情况。
      

  6.   


    “create table #锁表” 这个是锁表的sql语句吗???
    执行这条语句,该表就被锁了??不能修改了??
      

  7.   

    :) 如果按秒就不是计算机了。国防科大生产的天河一号的峰值计算性能达到了4.7Pflops,即每秒4.7千万亿次,是上一代的3.9倍,Linpack值达到2.507Pflops,达到上一代的4.4倍。
      

  8.   

    2010年6月,世界最快的電腦,根據國際超級電腦大會Top500全球超級電腦統計仍然是美國田納西州橡樹嶺國家實驗室的「美洲豹」(Cray Jaguar)超級電腦,該電腦在測試中取得了1.75petaflops的運算分數。另外中國的超級電腦「星雲」系統也同時超越眾多歐日超級電腦,躍居全球第二位。
      

  9.   

    根据实际需要,设置事务的隔离级别来控制并发操作,确保数据的一致性.
    SQL2000有4个隔离级别,
    SQL2008有6个隔离级别.
      

  10.   

    面试官应该问的是:在高并发的前提下进行主从表操作如何避免重号。如果是单表插入且主键是自增的话,在DBMS插入数据时,会自动排队的!
    而典型的并发访问-更新冲突问题应该是另一个问题(通过在软件层次上或数据库层次上加悲观或乐观锁)!
      

  11.   

    这个问题也算是搞数据库必须弄明白的一个问题了。。1、并发模型有悲观模型和乐观模型,SQL Server默认是悲观模型,也可以自己编程写成乐观模型;2、其他无非就是事务、隔离级别那些事情。一般让数据库默认处理就可以了。乱扯就是了,但要扯到点子上~
      

  12.   

    我觉得要做两个方便的验证,一方面是数据库的,一方面是应用程序的,在应用程序中还是要在注册前,获取数据库中已经存在的最大的ID,然后再进行本次插入的ID分配,最后是放在事务中进行处理
      

  13.   


    “事务隔离级别”有多少种,该怎么安排呢???我今天又去面试了,记了一招
    begin tran
    update T_name set age = 21 with(rowlock) where id = 1
    waitfor delay '00:00:30'
    commit tran
    但是没有用上。
      

  14.   


    是这本书吗?
    MICROSOFT SQL SERVER企业级平台管理实践_徐海蔚 
      

  15.   

    http://topic.csdn.net/u/20101220/14/b18ca50f-708a-4548-937d-3f47b49ffec2.html
      

  16.   

    怎么捕获和记录SQL Server中发生的死锁?
    http://topic.csdn.net/u/20101220/14/b18ca50f-708a-4548-937d-3f47b49ffec2.html
      

  17.   

    没必要一定要在数据库端限制,在java业务端使用sychronized 或者使用单例模式也可以的
      

  18.   

    今天面试管说:"你们并发是怎么处理的?"ME:重启sql服务
      

  19.   


    我不懂那个。我是做.net开发的。。
      

  20.   


    应聘asp.net程序员值为“并发”重启服务器有用吗??
      

  21.   

    多长时间的帖子了,还没结。
    同时注册?用户名上建个unique约束什么事都没了。