之前发过几个帖子问有关数据库防止并发的问题,很多人的回答是产用执行sql语句时对相应的数据加锁------1.如何锁定一个表的某一行?
---A连接中执行
set transaction isolation level repeatable read
begin tran
select * from tran_test with (rowlock) where id = 1
waitfor delay '00:00:30'
commit tran---B连接中如果执行
update tran_test set cola = '111' where id = 1 --需要等待30秒
update tran_test set cola = 'aaa' where id <> 3 --立即执行上面是里面的一个例子,现在模仿一个场景,用户一访问时执行上面的set语句,对数据行进行加锁(这儿不是很理解,当我执行这天语句时,等待了30秒,好像不是让别人等,而是浪费了自己的时间?),假设是让其他访问该行的用户等待30秒好了,此时用户二和用户三同时访问,但是由于用户二访问的数据已经被加锁,所以等待了30秒,而用户三访问的数据马上执行了。上面是一个更新数据的例子,用户一和用户二同时访问得到了那些可能被大家修改的信息,但是由于用户一先执行更新操作,并且保存,而用户二后执行操作,但是此时用户二的数据还是原来的那些,二不是被用户一更新之后的数据,也就是说用户一更新的不能及时告知用户二,那这样这个加锁看上去就没有什么意思了,或者说这个积极锁还不如消极锁,消极锁能马上告知用户数据已经被更新了,二这个积极锁却要做更多的事情才能有消极锁的效果(先加锁,后判断)?防止并发的用处到底是为了给用户一个好的体验(以免用户在不知情的状况下更改数据),还是确保数据库不出错(至于会出什么错我也不知道)??
关于并发问题的帖子已经发了不少了,感觉还是比较迷惑。
上面红色字体部分都是我比较有疑问的地方,请大家帮帮忙,谢了!!!

解决方案 »

  1.   

    repeatable read隔离级别是读未提交的时候不能更新并发带来的后果并不是所有都不能容忍的,你能容忍到什么程度就用什么级别的隔离级别
      

  2.   

    楼主,不要这么机械的理解嘛。先PS一下:你所说的积极锁和消极锁,正式名称应为悲观锁和乐观锁。例句中只是演示了如何进行锁定,具体应用时,使不使用,使用哪种锁还是由你自己根据实际情况判断。waitfor delay '00:00:30'这个句子只是为了方便你再现用的,实际中没人这么NC
      

  3.   


    好像没有怎么说清楚嘛。。
    该如何测试呢??
    如果我自己执行了那条语句岂不是要等三十秒才能有反应???PS和NC是什么意思呀??