之前发过几个帖子问有关数据库防止并发的问题,很多人的回答是产用执行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秒,而用户三访问的数据马上执行了。上面是一个更新数据的例子,用户一和用户二同时访问得到了那些可能被大家修改的信息,但是由于用户一先执行更新操作,并且保存,而用户二后执行操作,但是此时用户二的数据还是原来的那些,二不是被用户一更新之后的数据,也就是说用户一更新的不能及时告知用户二,那这样这个加锁看上去就没有什么意思了,或者说这个积极锁还不如消极锁,消极锁能马上告知用户数据已经被更新了,二这个积极锁却要做更多的事情才能有消极锁的效果(先加锁,后判断)?防止并发的用处到底是为了给用户一个好的体验(以免用户在不知情的状况下更改数据),还是确保数据库不出错(至于会出什么错我也不知道)??
关于并发问题的帖子已经发了不少了,感觉还是比较迷惑。
上面红色字体部分都是我比较有疑问的地方,请大家帮帮忙,谢了!!!
---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秒,而用户三访问的数据马上执行了。上面是一个更新数据的例子,用户一和用户二同时访问得到了那些可能被大家修改的信息,但是由于用户一先执行更新操作,并且保存,而用户二后执行操作,但是此时用户二的数据还是原来的那些,二不是被用户一更新之后的数据,也就是说用户一更新的不能及时告知用户二,那这样这个加锁看上去就没有什么意思了,或者说这个积极锁还不如消极锁,消极锁能马上告知用户数据已经被更新了,二这个积极锁却要做更多的事情才能有消极锁的效果(先加锁,后判断)?防止并发的用处到底是为了给用户一个好的体验(以免用户在不知情的状况下更改数据),还是确保数据库不出错(至于会出什么错我也不知道)??
关于并发问题的帖子已经发了不少了,感觉还是比较迷惑。
上面红色字体部分都是我比较有疑问的地方,请大家帮帮忙,谢了!!!
好像没有怎么说清楚嘛。。
该如何测试呢??
如果我自己执行了那条语句岂不是要等三十秒才能有反应???PS和NC是什么意思呀??