【问题很严重啊——死要死个明白】关于FOR UPDATE语句

iamxia 2007-10-17 05:29:27



执行语句
SELECT * FROM TABLE_A WHER FIELD_1 = 'AAAA' FOR UPDATE
;

最终查出的结果是3条记录,另,FIELD_1是主键中的第一个字段

执行了之后干别的事去了,约5~6个小时之后,发现表被锁了,而且是我锁的(之间再也没有对该表进行操作,好像也没再用SQL操作过数据库),回滚之后就好了,FOR UPDATE也会锁表???不是锁行的吗

由于涉及到责任重大,不说不行,咱死不怕,不过要死要死个明白!
...全文
235 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
iamxia 2007-10-19
  • 打赏
  • 举报
回复
原因找到

锁的是行,不是表。因为前台用TUXDEO,当某个用户恰巧对锁的行进行更新,就会等待,而SQL语句中又没有写等待时间,所以一直挂着,所以也就始终占在TUXDEO的队列的第一个位置(tuxdeo我不熟,只能这么描述了),从而造成了其他用户的等待。

我觉得应该是tuxdeo的问题,无论是做什么操作至少应该有一种超时机制,对队列进行管理
liuzi123 2007-10-19
  • 打赏
  • 举报
回复
关注下
ksrs 2007-10-19
  • 打赏
  • 举报
回复
7楼正确。FOR UPDATE对表加SHARE LOCK(共享锁),对影响的行加EXCLUSIVE LOCK(排它锁)
ruihuahan 2007-10-18
  • 打赏
  • 举报
回复
肯定有表锁,但不应该是exclusive table lock。
bjt_ 2007-10-18
  • 打赏
  • 举报
回复
SELECT * FROM TABLE_A WHER FIELD_1 = 'AAAA ' FOR UPDATE
会产生两种锁,对FIELD='AAAA'的行的独占锁,不允许其他用户修改这些行
对整张表的共享锁,但是是允许其他用户修改别的行的,主要是不允许修改表结构之类
AFIC 2007-10-18
  • 打赏
  • 举报
回复
>>这么说 SELECT ... FOR UPDATE WHERE ...锁的应该是符合条件的记录对吧

不对,锁的是整个表,因为where可以很复杂(就算你的简单他不会专门区分的),
oracle才没心情检索到底该锁哪一个,所以就全表锁定
全表锁定不影响插入,你试试update任意列。
iamxia 2007-10-18
  • 打赏
  • 举报
回复

用了FOR UPDATE之后,对表可以进行查询、插入、更新操作,也就是顶多是锁行,即对涉及到的行有更新操作
iamxia 2007-10-17
  • 打赏
  • 举报
回复

这么说 SELECT ... FOR UPDATE WHERE ...锁的应该是符合条件的记录对吧

但现在的问题是锁了整个表,IT的dba查到我这里说是我锁了表,所以整个系统都不能用,找到我一看先前的SQL窗口还在而且是没有提交或者说是回滚(我偷个懒修改数据后直接用SELECT FOR UPDATE查询的),后来回滚就好了。我后悔没看看锁的相关信息
ilovemk 2007-10-17
  • 打赏
  • 举报
回复
2楼的意思是你select * from test的话实际上是选择了表的所有行,所以每一行都会加行锁,你用起来也就觉得那是加了表锁的。
iamxia 2007-10-17
  • 打赏
  • 举报
回复
楼上的意思是锁一列?
不会吧,我后来做了测试,
1、for update, 插入一行,单并不提交
2、在打开另外一个SQL窗口,写入insert 语句向表插入一行数据,然后提交(commit)
实际结果是可以的

另外,我的where条件很简单 只有 field_1 = '????'
AFIC 2007-10-17
  • 打赏
  • 举报
回复
FOR UPDATE OF FIELD_1锁一列,
不然你想oracle给你分析你的where条件那是不可能的
where可以很复杂的。
iamxia 2007-10-17
  • 打赏
  • 举报
回复

执行顺序
1、SELECT * FROM TABLE_A WHER FIELD_1 = 'AAAA ' FOR UPDATE
;

2、更新数据

3、commit

4、SELECT * FROM TABLE_A WHER FIELD_1 = 'AAAA ' FOR UPDATE
;

5、没有了

17,088

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧