两个问题:
1、pl/sql developer操作数据库时,右键选择一行数据修改时,有时别人无法对该表修改,问下这是不是锁表现象。2、我后来写了个客户端,通过客户端来来修改某行数据,就是UPDATE 表名称 SET 列名称 = 新值 WHERE 列名称 = 某值,这样修改时就不会锁表。请问这是为什么呢?

解决方案 »

  1.   

    两个问题:
    1、pl/sql developer操作数据库时,右键选择一行数据修改时,有时别人无法对该表修改,问下这是不是锁表现象。很少用这个工具,基本上都是PLSQL
    2、我后来写了个客户端,通过客户端来来修改某行数据,就是UPDATE 表名称 SET 列名称 = 新值 WHERE 列名称 = 某值,这样修改时就不会锁表。请问这是为什么呢?
    行级锁
      

  2.   

    pl/sql developer操作数据库时,右键选择一行数据修改时,pl/sql developer内部机制使表的一行锁定。没有commit前别的用户不能修改,
    我后来写了个客户端,通过客户端来来修改某行数据,就是UPDATE 表名称 SET 列名称 = 新值 WHERE 列名称 = 某值,这样修改时就不会锁表。请问这是为什么呢?
    客户端把你修改的数据放在undo表空间中,当你commit后才真正修改表。
      

  3.   

    其实的疑问是我那样通过自己写的登陆工具,然后通过按钮单击事件触发update语句修改某个字段的值,这样是不是可以达到避免锁表的问题。
      

  4.   

    1、pl/sql developer操作数据库时,右键选择一行数据修改时,有时别人无法对该表修改,问下这是不是锁表现象。这样做的时候相当于select...from tablename  for update;这相当于把这行给锁住了,这个确实是锁。你可以在pl/sql developer里面再开一个窗口就可以查了.2、我后来写了个客户端,通过客户端来来修改某行数据,就是UPDATE 表名称 SET 列名称 = 新值 WHERE 列名称 = 某值,这样修改时就不会锁表。这个就相当于再开了一个connection了,你进行dml语句没有提交时,这个数据块会被标记为CR状态,你可以在另外一个连接里面进行select,因为select会在undo中查找被标记为cr状态的数据块的复制数据块。
      

  5.   

    你那个工具可能使用的是ADO之类来控制和提交DB的,
    基于工具的设定,可能对焦点所在的航进行行级锁的预设定。
    就造成了,行或者表的锁定状态。你自己写的update语句,其实是有锁得,
    不然就没办法保证数据一致性,防止脏读脏写了。
    只是锁状态只维持在表的更新瞬间,不易被察觉。
      

  6.   


    两个疑问:
    1、实际工作中发现某人修改行时,整张表别人都不能用。。---难道是他锁表了?
    2、dml语句没有提交是什么意思?每次执行完一次update语句不是被提交了吗?你指的提交是什么意思?还有你说的cr状态是什么状态。undo又是个什么玩意。。回答好我追加分哈
      

  7.   


    用java写的客户端,用的好像是jdbc连的数据库。
    你说的只维持在表的更新瞬间,是不是我通过客户端执行update时,数据会上锁--提交--解锁。
      

  8.   


    引用 6 楼 hewei_shine 的回复:
    1、pl/sql developer操作数据库时,右键选择一行数据修改时,有时别人无法对该表修改,问下这是不是锁表现象。这样做的时候相当于select...from tablename for update;这相当于把这行给锁住了,这个确实是锁。你可以在pl/sql developer里面再开一个窗口就可以查了.2、我后来写了个客户端,通过客户端来来修改某行数据,就是UPDATE ……两个疑问:
    1、实际工作中发现某人修改行时,整张表别人都不能用。。---难道是他锁表了?
    2、dml语句没有提交是什么意思?每次执行完一次update语句不是被提交了吗?你指的提交是什么意思?还有你说的cr状态是什么状态。undo又是个什么玩意。。回答好我追加分哈某人修改行时会触发行级锁,别人能够select表数据,但是不能修改表中被锁的行数据,没有被锁的行是可以修改的。
    dml语句就是insert,update,delete这些语句。执行完这些语句要commit才会提交(如果设了自动commit除外)。你可用select * from v$bh;这条语句来查询block的状态,一般是xcur状态,cr及时事务状态,及当前块在一个未提交的事务中,被当前事务锁住。undo比较复杂,这个是oracle的技术专利,一下子讲不清楚,简单理解就是它里面存放一个表之前的样子,undo机制是为了保证读一致性,你修改一个数据未提交,别人查这个数据看到的是你没有修改之前的。
      

  9.   

    你说“执行完这些语句要commit才会提交(如果设了自动commit除外)。”这个在哪设置?
      

  10.   

    pl/sql developer中不知道哪设置,应该不允许设置。java程序默认情况是自动commit的,用conn.setAutoCommit(false)可以关掉,最好关掉。
      

  11.   

    操作不当造成的,如果要修改某行数据,不要对表直接编辑,要使用select  from where for update,精确锁定数据进行更改,不要对整张表进行锁定,这样即使忘记去掉锁,也仅仅是对一条数据有影响。
      

  12.   


    如果是自动commit那我就放心了。
      

  13.   

    1. 全表锁
    2. 只对where条件能匹配上的行加锁
      

  14.   

    应该不会,除非在修改的时候有人在操作。。PLSQLDEVELOP你用的是基于for update的语句修改还是rowid的呢。。