两个问题:
1、pl/sql developer操作数据库时,右键选择一行数据修改时,有时别人无法对该表修改,问下这是不是锁表现象。2、我后来写了个客户端,通过客户端来来修改某行数据,就是UPDATE 表名称 SET 列名称 = 新值 WHERE 列名称 = 某值,这样修改时就不会锁表。请问这是为什么呢?
1、pl/sql developer操作数据库时,右键选择一行数据修改时,有时别人无法对该表修改,问下这是不是锁表现象。2、我后来写了个客户端,通过客户端来来修改某行数据,就是UPDATE 表名称 SET 列名称 = 新值 WHERE 列名称 = 某值,这样修改时就不会锁表。请问这是为什么呢?
1、pl/sql developer操作数据库时,右键选择一行数据修改时,有时别人无法对该表修改,问下这是不是锁表现象。很少用这个工具,基本上都是PLSQL
2、我后来写了个客户端,通过客户端来来修改某行数据,就是UPDATE 表名称 SET 列名称 = 新值 WHERE 列名称 = 某值,这样修改时就不会锁表。请问这是为什么呢?
行级锁
我后来写了个客户端,通过客户端来来修改某行数据,就是UPDATE 表名称 SET 列名称 = 新值 WHERE 列名称 = 某值,这样修改时就不会锁表。请问这是为什么呢?
客户端把你修改的数据放在undo表空间中,当你commit后才真正修改表。
基于工具的设定,可能对焦点所在的航进行行级锁的预设定。
就造成了,行或者表的锁定状态。你自己写的update语句,其实是有锁得,
不然就没办法保证数据一致性,防止脏读脏写了。
只是锁状态只维持在表的更新瞬间,不易被察觉。
两个疑问:
1、实际工作中发现某人修改行时,整张表别人都不能用。。---难道是他锁表了?
2、dml语句没有提交是什么意思?每次执行完一次update语句不是被提交了吗?你指的提交是什么意思?还有你说的cr状态是什么状态。undo又是个什么玩意。。回答好我追加分哈
用java写的客户端,用的好像是jdbc连的数据库。
你说的只维持在表的更新瞬间,是不是我通过客户端执行update时,数据会上锁--提交--解锁。
引用 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机制是为了保证读一致性,你修改一个数据未提交,别人查这个数据看到的是你没有修改之前的。
如果是自动commit那我就放心了。
2. 只对where条件能匹配上的行加锁