[锁表?]oracle下执行 update tb set state = 1 where id = ? 发生了锁表

山哥 发布于 2013/01/29 10:09
阅读 6K+
收藏 0

最近客户的系统发生了异常,数据展示过慢卡死,数据无法入库,经检查发现:该表被锁住了,查到的语句是: update tb set state =1 where id = ?

上面的数据是在查看一条数据明细时发生的,用户要求:查看过的数据要求标识成已读:

// 获取新闻数据明细
News  news = getDetailById(id);
// 执行更新操作
boolean res = jdbcHandler.update("update nb_news set state = 1 where id = ?", id);

不明白的是:这里为什么会产生锁表? update 语句不应该是行锁吗?

同时检查到其他的表也出现了锁表,而且都是 update 语句。

客户发飙了,我们崩溃了,希望大家帮忙分析下.......

系统环境:WEB系统,Oracle 11g, C3P0连接池, Tomcat7

加载中
0
山哥
山哥
我先升上去,请大家帮忙分析下:jdbc操作oracle什么情况下会出现异常的锁表??
0
StormFour
StormFour
oracle 所有的操作都是行锁,这是可以确定的。出现行锁很正常,事务正常结束时commit就行了。
StormFour
StormFour
回复 @JSON : 再者,如果你是整张表被锁的话只有一种情况,就是一次操作了整张表而没有将事务提交。
StormFour
StormFour
回复 @JSON : 什么叫没有用事务,你发出的任何一个update都在一个事务里,要么就是你没有将事务提交。
山哥
山哥
要是行锁就好了,现在是表锁。 没有用事务。
0
星爷
星爷
是不是哪里设置事务是有问题?
山哥
山哥
没有使用事务,就是普通的jdbc操作。
0
老骥伏枥-志在千里
老骥伏枥-志在千里
检查下state 列上是否有位索引
山哥
山哥
没有建索引
0
IdleMan
IdleMan
你们是如何判断数据库中有表锁了,又如何判定是这一句引起的。最好更详细一点,有可能根本不是这个原因。一般主键、唯一索引才容易引起堵塞。还有oracle的write永远不会堵塞常规的select。
IdleMan
IdleMan
回复 @JSON : 有可能是其他Insert或UPDATE造成的。最好看下唯一性的列相关的操作。
山哥
山哥
首先是界面访问该表数据卡死,DBA发现表被锁了,然后通过oracle的sql命今看到大量的update语句被堵塞。
0
whaon
whaon
只要正常提交或回滚是不会锁表的
0
t
text_android

会不会是因为多个进程同时对一条数据进行加锁导致的?

IdleMan
IdleMan
嗯,如果这个发生,这个叫concurrent等待
0
StormFour
StormFour
update tb set state =1 where id = ?

如果只是单纯的这一条语句的话我可以很肯定的告诉你,这条语句绝对是用的行锁。因为oracle根本没有表锁的概念。大致的原因应该就是你代码中没有将事务提交而导致的。

山哥
山哥
使用的connection都是autoCommit的,不存在事务没有提交的情况啊。
0
山哥
山哥
我是使用c3p0连接池组件+apache-dbutils的,从c3p0中获取connection后,调用dbutils的query_runner.update()接口执行update语句的。这里面的connection是自动commit模式的。
0
山哥
山哥
在执行这个update之前是有一个查询明细的select,有没有可能这个select语句并发下较慢然后后面的update对同一条数据又进行更新导致的?因为select获取的是排它锁。
返回顶部
顶部