谢谢up!
补充问题:
5。每一条SQL操作都会对应一个事务,也就意味着会隐含的对操作的表加锁,比如select会默认共享锁,那么不同类型的锁在同一个“大事务”中的有效期有多长呢?也就是说,如果我不显式holdlock的话,每种锁的有效期持续到什么时候?如:
begin tran
select * from b1 //执行完就释放还是保持到commit ?
insert into b2 values(...) //执行完就释放还是保持到commit ?
...
commit
补充问题:
5。每一条SQL操作都会对应一个事务,也就意味着会隐含的对操作的表加锁,比如select会默认共享锁,那么不同类型的锁在同一个“大事务”中的有效期有多长呢?也就是说,如果我不显式holdlock的话,每种锁的有效期持续到什么时候?如:
begin tran
select * from b1 //执行完就释放还是保持到commit ?
insert into b2 values(...) //执行完就释放还是保持到commit ?
...
commit
对于共享锁,除非显式holdlock,要不然语句执行完马上就释放。而其它的锁会一直保持到事务结束。换句话说就是,“可能修改数据”的锁将会(也应该)保持到事务结束。
不知道这个说法是否有问题?
不知有没有oledb api?
如果有的话该上查什么资料?
如果没有的话,odbc api的资料及例子也行,希望各位高手帮帮忙,谢谢!
先谢谢您的回答!关于:
“一个连接可以开多线程来共享连接,即可以有多个事务,事务是两阶段提交,但不管连接多少,同一时刻只允许一个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”超时,结论:和很多资料说的一样。