今天同事发过来的一个问题:
悲观锁定
xxxx 2008年03月26日 10:02:18
paul,问一下。 锁表是需在开始事务之前做,还是之后做?
Paul Yi(Paul Yi) 2008年03月26日 10:02:51
事务之前
xxxx 2008年03月26日 10:03:17
那解锁是在提交事务之后?
Paul Yi(Paul Yi) 2008年03月26日 10:04:29
锁住了这个表还有对这个表其他相关事务操作吗
xxxx 2008年03月26日 10:05:38
是的。
1锁表
2开始事务
3对该表查询
4插入或更新
5提交事务
6解锁
Paul Yi(Paul Yi) 2008年03月26日 10:07:11
锁住了这个表查询应该可以但不能对这个表作插入或更新数据吧
xxxx 2008年03月26日 10:08:33
如果有一个业务需要先查询有没有记录,有的话更新该记录,没有的话要插入一条。
但这个业务是并发的,那要怎样处理?
xxxx 2008年03月26日 10:09:05
我想是先锁表,然后判断有无存在的记录,处理完后解锁。这样来处理并发问题。
xxxx 2008年03月26日 10:09:19
就不会因为并发,同时插入两天一样的记录
xxxx 2008年03月26日 10:09:25
两条
Paul Yi(Paul Yi) 2008年03月26日 10:11:40
select * from table for update 这样你看下
4插入或更新
5提交事务
6解锁
xxxx 2008年03月26日 10:13:14
什么时候开始事务?
Paul Yi(Paul Yi) 2008年03月26日 10:13:40
select * from table for update 这个就开始了
xxxx 2008年03月26日 10:14:26
1。开始事务
2。select * from table for update
3。插入或更新
5。提交事务
这样的话,就算并发,它也会锁死在第2步中
Paul Yi(Paul Yi) 2008年03月26日 10:14:40
他这个是锁住记录,并没锁表
xxxx 2008年03月26日 10:16:19
锁住所有记录的话,并发时会停在第2步中,这样就不会有问题了
Paul Yi(Paul Yi) 2008年03月26日 10:17:06
其他用户只能等解锁后才能对这个表进行更新或删除
xxxx 2008年03月26日 10:18:43
流程:
1。开始事务
2。select * from table for update
3。查找所要的记录是否存在
4。根据第3步的结果进行插入或更新
5。提交事务
xxxx 2008年03月26日 10:19:09
这样并发操作会等在第2步中,不会因为并发而影相第3步的判断
Paul Yi(Paul Yi) 2008年03月26日 10:20:33
对 如果2步并发时不想让别人等待立即发出信息的话可以加上 select * from table for update nowait
并发用户看到的是资源正忙
xxxx 2008年03月26日 10:23:21
THX