问1:这样可能出现死锁吗?比如因为数据库的锁
SQLServer默认是行锁,不会问2:如果不会产生死锁,通常开多少个线程进行并发访问会比较有效率(各个线程做同样的工作,都是从消息队列中取到消息并处理之);1个?3个?100个?看你的硬件设备,你用代码编个连接池出来嘛

解决方案 »

  1.   

    线程调度需要消耗内存和cpu资源。线程越多越有效率?有点“多此一举”之嫌。
      

  2.   

    当执行一个类似 
    select * from t where a=1 or b=2
    的查询时,SQL Server会自己并行查询。但是,这是服务器内部的事。将命令一次性地串给服务器,这是最有效率的。用100个线程将命令分别传给数据库,与用一个查询批处理将100个命令一次性传给服务器,当然是后者更有效率(包括执行效率)。
      

  3.   

    都是高手:)
    我现在用的是DBTOOLS,程序出现会死有时候,有时候是数据库是,可能是上述原因吗?
    另外大力兄我的机器配置豪华,呵呵,照你说的,如果我用连接池能提高效率吗?
      

  4.   

    使用连接池的益处
    每当资源尝试访问数据库时,它必须连接到该数据库上。数据库连接会耗费系统开销,这是因为需要资源来创建连接和维护连接,并且当不再需要连接时释放它。基于 Web 的应用程序所需的系统开销特别高,这是因为 Web 用户的连接或断开更为频繁。 另外,由于因特网的冲浪性质,用户交互通常是更简短的。通常连接和断开所消耗的资源比交互本身所消耗的资源要多。此外,由于因特网请求可以从任何地方以虚拟的形式到达,资源的耗费量可能十分巨大,因而就难以估计。
      

  5.   

    SQL的事务隔离级别
    使用SET TRANSACTION ISOLATION LEVEL来控制由连接发出的所有语句的默认事务锁定行为从低到高依次是
    READ UNCOMMITTED执行脏读或 0 级隔离锁定,这表示不发出共享锁,也不接受排它锁。当设置该选项时,可以对数据执行未提交读或脏读;在事务结束前可以更改数据内的数值,行也可以出现在数据集中或从数据集消失。该选项的作用与在事务内所有语句中的所有表上设置 NOLOCK 相同。这是四个隔离级别中限制最小的级别。举例设table1(A,B,C)
    A    B    C
    a1   b1   c1
    a2   b2   c2
    a3   b3   c3新建两个连接
    在第一个连接中执行以下语句
    select * from table1
    begin tran
    update table1 set c='c'
    select * from table1
    waitfor delay '00:00:10'  --等待10秒
    rollback tran
    select * from table1在第二个连接中执行以下语句
    SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
    print '脏读'
    select * from table1
    if @@rowcount>0
    begin
     waitfor delay '00:00:10' 
     print '不重复读'
     select * from table1
    end第二个连接的结果脏读
    A    B    C
    a1   b1   c
    a2   b2   c
    a3   b3   c'不重复读'
    A    B    C
    a1   b1   c1
    a2   b2   c2
    a3   b3   c3READ COMMITTED指定在读取数据时控制共享锁以避免脏读,但数据可在事务结束前更改,从而产生不可重复读取或幻像数据。该选项是 SQL Server 的默认值。
    在第一个连接中执行以下语句
    SET TRANSACTION ISOLATION LEVEL READ COMMITTED
    begin tran
    print '初始'
    select * from table1
    waitfor delay '00:00:10'  --等待10秒
    print '不重复读'
    select * from table1
    rollback tran
    在第二个连接中执行以下语句
    SET TRANSACTION ISOLATION LEVEL READ COMMITTEDupdate table1 set c='c'
      第一个连接的结果初始
    A    B    C
    a1   b1   c1
    a2   b2   c2
    a3   b3   c3不重复读
    A    B    C
    a1   b1   c
    a2   b2   c
    a3   b3   cREPEATABLE READ锁定查询中使用的所有数据以防止其他用户更新数据,但是其他用户可以将新的幻像行插入数据集,且幻像行包括在当前事务的后续读取中。因为并发低于默认隔离级别,所以应只在必要时才使用该选项。
    在第一个连接中执行以下语句
    SET TRANSACTION ISOLATION LEVEL REPEATABLE READ
    begin tran
    print '初始'
    select * from table1
    waitfor delay '00:00:10'  --等待10秒
    print '幻像读'
    select * from table1
    rollback tran
    在第二个连接中执行以下语句
    SET TRANSACTION ISOLATION LEVEL REPEATABLE READ
    insert  table1 select 'a4','b4','c4'
    第一个连接的结果初始
    A    B    C
    a1   b1   c1
    a2   b2   c2
    a3   b3   c3幻像读
    A    B    C
    a1   b1   c1
    a2   b2   c2
    a3   b3   c3
    a4   b4   c4
    SERIALIZABLE在数据集上放置一个范围锁,以防止其他用户在事务完成之前更新数据集或将行插入数据集内。这是四个隔离级别中限制最大的级别。因为并发级别较低,所以应只在必要时才使用该选项。该选项的作用与在事务内所有 SELECT 语句中的所有表上设置 HOLDLOCK 相同。
    在第一个连接中执行以下语句
    SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
    begin tran
    print '初始'
    select * from table1
    waitfor delay '00:00:10'  --等待10秒
    print '没有变化'
    select * from table1
    rollback tran
    在第二个连接中执行以下语句
    SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
    insert  table1 select 'a4','b4','c4'
    第一个连接的结果初始
    A    B    C
    a1   b1   c1
    a2   b2   c2
    a3   b3   c3没有变化
    A    B    C
    a1   b1   c1
    a2   b2   c2
    a3   b3   c3
      

  6.   

    我的情况是有很多操作涉及数据库操作,如果我开3个线程,并在程序运行期始终保持3个连接分别对操作处理,这样会有效率的提升吗?
    我的经验是如果3个线程,最好不要用CONNECTION POOLING,因为建立连接池和维护的开销也比较高.