谢谢up!
补充问题:
5。每一条SQL操作都会对应一个事务,也就意味着会隐含的对操作的表加锁,比如select会默认共享锁,那么不同类型的锁在同一个“大事务”中的有效期有多长呢?也就是说,如果我不显式holdlock的话,每种锁的有效期持续到什么时候?如:
begin tran
select * from b1  //执行完就释放还是保持到commit ?
insert into b2 values(...) //执行完就释放还是保持到commit ?
...
commit

解决方案 »

  1.   

    关于问题5,我做了些测试,结论是:
    对于共享锁,除非显式holdlock,要不然语句执行完马上就释放。而其它的锁会一直保持到事务结束。换句话说就是,“可能修改数据”的锁将会(也应该)保持到事务结束。
    不知道这个说法是否有问题?
      

  2.   

    所谓事务是BEGIN TRTANS... END TRANS一段,你只要把对数据库的操作写在其中,SQL SERVER会自动处理锁的问题,你也可以手动加锁一个连接可以开多线程来共享连接,即可以有多个事务,事务是两阶段提交,但不管连接多少,同一时刻只允许一个INSERT操作,即写操作是排他的
      

  3.   

    我也有几个问题想要问一下:
    不知有没有oledb api?
    如果有的话该上查什么资料?
    如果没有的话,odbc api的资料及例子也行,希望各位高手帮帮忙,谢谢!
      

  4.   

    to OpenVMS(半知半解):
    先谢谢您的回答!关于:
    “一个连接可以开多线程来共享连接,即可以有多个事务,事务是两阶段提交,但不管连接多少,同一时刻只允许一个INSERT操作,即写操作是排他的”
    首先,我不反对这种说法。但从socket通信来说,这其中存在着问题,试想,当我们多线程公用同一个连接多次收发数据时会出什么情况?
    现在回到事务上来,2个线程公用同一数据库连结,对于数据库来说,可能收到的代码断如下:
    1.结果是事务全部回滚
    begin tran a
    delete from tab_a
    begin tran b
    rollback tran b  //commit tran b
    commit tran a    //rollback tran a
    2.显然,delete完成
    begin tran a
    delete from tab_a
    commit tran a
    begin tran b
    rollback tran b为了测试1的结果,我采取了如下方法:
    1。直接在SQL SERVER的控制台执行,结果全部回滚
    2。2个线程共享同一DB连结,线程1开始新事务,执行“insert”,线程1"sleep(10s)",线程2先“sleep(2s)”,然后“insert”,线程2“rollback”或“commit”,线程1“commit”或“rollback”,结果是:只要2个线程有一个rollback,操作都rollback。关于:“所有锁将会保持到事务结束,所以你应该尽量避免用大事务”
    首先,很赞同“尽量避免用大事务”。
    然后,对于锁的保持,我也进行了测试,当然重点是测试共享锁,其他的锁也附带测了,结论请看我上面的留言,方法如下:
    1。2个线程,使用不同的db连接,设置SQL_ATTR_QUERY_TIMEOUT--〉3s
    线程1“select”,然后“sleep(10s)”,线程2“sleep(2s)”,然后“insert”,结果“insert”成功。
    前提同上,线程1“select ... with(holdlock)”,结果线程2“insert“超时。
    结论:共享锁除非显式hold,否则用完马上释放。
    2。2个线程,使用不同的db连接,设置SQL_ATTR_QUERY_TIMEOUT--〉3s
    线程1“insert”,然后“sleep(10s)”,线程2“sleep(2s)”,然后“select”,结果“select”超时,结论:和很多资料说的一样。