oracle手动锁表


手工锁表:
lock table tbl_t1 in row share mode nowait;                --2
lock table tbl_t1 in share update mode nowait;             --2
lock table tbl_t1 in row exclusive mode nowait;            --3
lock table tbl_t1 in share mode nowait;                    --4
lock table tbl_t1 in share row exclusive mode nowait;      --5
lock table tbl_t1 in exclusive mode nowait;                --6


0:none
1:null      空                 
2:Row-S     行共享(RS):共享表锁   
3:Row-X     行专用(RX):用于行的修改
4:Share     共享锁(S):阻止其他DML操作
5:S/Row-X   共享行专用(SRX):阻止其他事务操作
6:exclusive 专用(X):独立访问使用

手工解锁:
rollback/commit
http://blog.163.com/xjming487@126/blog/static/21295135200951081942377/


参考:

oracle手动锁定表  百度

oracle一个事务期间 锁定一个表 百度

Oracle事务之一:锁和隔离 - 小笨笨 - 博客园


oracle事务控制  百度

Oracle的事务控制

  (2012-02-08 09:25:49)
标签: 

it

分类: 工作

整天说Oracle的事务实际上是指INSERT,UPDATRE,DELETE,SELECT...FOR UPDATE语句,即DML语句

当在应用程序中执行第一条SQL语句时,开始事务;当执行COMMIT或ROLLBACK语句时,结束事务。

 

1.事务和锁

当执行事务操作(DML语句)时,Oracle会被作用表上加表锁,以防止其他用户改变表结构;同时会在被作用行上加行锁,以防止其他事务在相应行上执行DML操作。

 

会话A:

UPDATE emp SET sal=sal*2 WHERE ename='Tom';

会话B:

ALTER TABLE emp ADD remark VARCHAR2(100);

ERROR 位于第1行;

ORA-00054:资源正忙,需求指定NOWAIT

 

为了确保数据库数据的读一致性,不允许其他用户读取脏数据(未提交数据)。

假定会话A将雇员SCOTT工资修改为2000(未提交),那么其他会话将只能查询到原来的工资。只有在会话A提交了实务之后,其他会话才能查询到新工资。

会话A:

UPDATE emp SET sal=2000

WHERE ename='Tom';

会话B:

SELECT sal FROM emp WHERE ename='Tom';

 

SAL

--------

3000

 

2.提交事务

使用COMMIT语句可以提交事务。当执行了COMMIT语句之后,会确认事务变化,结束事务,删除保存点,释放锁。当使用COMMIT语句结束事务之后,其他会话将可以查看到事务变化后的新数据。

会话A:

UPDATE emp SET sal=2000

WHERE ename='Tom';

COMMIT;

会话B:

SELECT sal FROM emp WHERE ename='Tom';

SAL

------

2000

 

3.回退事务

 

保存点(savepoint)是事务中的一点,用于取消部分事务。当结束事务时,会自动删除该事务所定义的所有保存点。在执行ROLLBACK命令时,通过指定保存点可以取消部分事务。

☆设置保存点

sacepoint a;

exec dbms_transaction.savepoint('a');

 

☆取消部分事务

rollback to a;

exec dbms_transaction.rollback_savepoint('a');

 

☆取消全部事务

rollback;

exec dbms_transaction.rollback;

 

 

 

4.只读事务

不会取得新的数据变化,从而确保取得特定时间点的数据信息。

会话A:

SET TRANSACTION READ ONLY;①

SELECT sal FROM emp WHERE ename='Tom';③

 

会话B:

UPDATE emp SET sal=1000②

WHERE ename='Tom';

COMMIT;

 

SAL

------

2000

 

5.顺序事务

 

上面的只读事务可以使用用户取得特定时间点的数据信息,当设置了只读事务时,会话将不能执行DML语句,为了使用户可以取得特定时间点的数据,并且允许执行DML操作,可以使用顺序事务。

 

SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;

 

===================================

oracle锁定表  百度


Oracle的锁表与解锁  

SELECT /*+ rule */ s.username,
decode(l.type,'TM','TABLE LOCK',
'TX','ROW LOCK',
NULL) LOCK_LEVEL,
o.owner,o.object_name,o.object_type,
s.sid,s.serial#,s.terminal,s.machine,s.program,s.osuser
FROM v$session s,v$lock l,dba_objects o
WHERE l.sid = s.sid
AND l.id1 = o.object_id(+)
AND s.username is NOT Null

--kill session语句
alter system kill session'50,492';
--以下几个为相关表
SELECT * FROM v$lock;
SELECT * FROM v$sqlarea;
SELECT * FROM v$session;
SELECT * FROM v$process ;
SELECT * FROM v$locked_object;
SELECT * FROM all_objects;
SELECT * FROM v$session_wait;
--1.查出锁定object的session的信息以及被锁定的object名
SELECT l.session_id sid, s.serial#, l.locked_mode,l.oracle_username,
l.os_user_name,s.machine, s.terminal, o.object_name, s.logon_time
FROM v$locked_object l, all_objects o, v$session s
WHERE l.object_id = o.object_id
AND l.session_id = s.sid
ORDER BY sid, s.serial# ;
--2.查出锁定表的session的sid, serial#,os_user_name, machine name, terminal和执行的语句
--比上面那段多出sql_text和action
SELECT l.session_id sid, s.serial#, l.locked_mode, l.oracle_username, s.user#,
l.os_user_name,s.machine, s.terminal,a.sql_text, a.action
FROM v$sqlarea a,v$session s, v$locked_object l
WHERE l.session_id = s.sid
AND s.prev_sql_addr = a.address
ORDER BY sid, s.serial#;
--3.查出锁定表的sid, serial#,os_user_name, machine_name, terminal,锁的type,mode
SELECT s.sid, s.serial#, s.username, s.schemaname, s.osuser, s.process, s.machine,
s.terminal, s.logon_time, l.type
FROM v$session s, v$lock l
WHERE s.sid = l.sid
AND s.username IS NOT NULL
ORDER BY sid;

这个语句将查找到数据库中所有的DML语句产生的锁,还可以发现,
任何DML语句其实产生了两个锁,一个是表锁,一个是行锁。
杀锁命令
alter system kill session 'sid,serial#'
SELECT /*+ rule */ s.username,
decode(l.type,'TM','TABLE LOCK',
'TX','ROW LOCK',
NULL) LOCK_LEVEL,
o.owner,o.object_name,o.object_type,
s.sid,s.serial#,s.terminal,s.machine,s.program,s.osuser
FROM v$session s,v$lock l,dba_objects o
WHERE l.sid = s.sid
AND l.id1 = o.object_id(+)
AND s.username is NOT NULL
如果发生了锁等待,我们可能更想知道是谁锁了表而引起谁的等待
以下的语句可以查询到谁锁了表,而谁在等待。
以上查询结果是一个树状结构,如果有子节点,则表示有等待发生。
如果想知道锁用了哪个回滚段,还可以关联到V$rollname,其中xidusn就是回滚段的USN
col user_name format a10
col owner format a10
col object_name format a10
col object_type format a10
SELECT /*+ rule */ lpad(' ',decode(l.xidusn ,0,3,0))||l.oracle_username User_name,
o.owner,o.object_name,o.object_type,s.sid,s.serial#
FROM v$locked_object l,dba_objects o,v$session s
WHERE l.object_id=o.object_id
AND l.session_id=s.sid
ORDER BY o.object_id,xidusn DESC

==================================================

数据库事务处理之排他锁
下面做作一个实验,验证锁的效果
终端一,首先进入事务状态然后运行下面语句
 
mysql> begin;
Query OK, 0 rows affected (0.00 sec)
 
mysql> select * from t1 where id='3' for update;
+----+--------+---------------------+---------------------+
| id | name   | ctime               | mtime               |
+----+--------+---------------------+---------------------+
|  3 | test   | 0000-00-00 00:00:00 | 2013-01-14 13:05:41 |
+----+--------+---------------------+---------------------+
1 row in set (0.00 sec)
 
终端二, 查询表中数据
 
mysql> select * from t1;
+----+--------+---------------------+---------------------+
| id | name   | ctime               | mtime               |
+----+--------+---------------------+---------------------+
|  1 | neo    | 0000-00-00 00:00:00 | 2013-01-14 13:00:00 |
|  2 | zen    | 0000-00-00 00:00:00 | 2013-01-14 13:00:43 |
|  3 | test   | 0000-00-00 00:00:00 | 2013-01-14 13:05:41 |
+----+--------+---------------------+---------------------+
3 rows in set (0.00 sec)
 
增加“for update”查询非锁定记录  
 
mysql> select * from t1 where id=2 for update;
+----+------+---------------------+---------------------+
| id | name | ctime               | mtime               |
+----+------+---------------------+---------------------+
|  2 | zen  | 0000-00-00 00:00:00 | 2013-01-14 13:00:43 |
+----+------+---------------------+---------------------+
1 row in set (0.00 sec)
 
查询被锁定记录
 
mysql> select * from t1 where id=3 for update;
ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction
 
查询所有记录,因为记录中包含了id=3那条,所以也不允许查询。
 
mysql> select * from t1 for update;
ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction
 
测试修改记录
 
mysql> UPDATE `t1` SET `name`='testaa' WHERE  `id`=3;
ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction
 
提示
在没有出现ERROR 1205 (HY000)的这段时间,只要终端一中执行commit,rollback.终端二中的语句就会运行。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值