oracle更新及实物处理

oracle数据增加:

数据增加有两种方式

1)INSERT INTO 表[(列1,列2,...)] VALUES(值1,值2,.....)

2)INSERT INTO 表[(列1,列2,...)] 子查询

第一种是我们常见的插入数据操作,但是当我们使用第一种时要注意几点

1.最好使用完整语法进行数据增加,虽然像INSERT INTO emp VLUES(0,'asd','asdas',da,TO_DATE('2014-08-11','yyyy-mm-dd'),0,0,0);这样的插入也可以

但是为了更好的理解所插入的列是什么意思,也为了更好的维护在INTO emp()中写入列,最好不省略。

2.如果要插入的记录只有部分记录那么只需要编写所需要的数据列即可,如:INSERT INTO emp(empno,ename,job,hiredate,sal) VALUES(......);当然这里也

推进写出列名。

第二种我们平时使用比较少,但是oracle提供了此功能,就是通过子查询查到记录然后将结果插入到需要插入的表中

如:INSERT INTO emp select * from emp where deptno=10;

数据的更新:

更新操作也插入一样也有两种方式更新

1)UPDATE 表 SET 字段=值[,字段=值,....] [WHERE 更新条件(s)]

2)UPDATE 表 SET(字段,字段...)=(SELECT 字段,字段,... FROM 表 WHERE 条件(s))

第一种操作我们常用,但是我们要注意,如果不写更新条件表示更新整个表,但是在数据库的更新操作时如果可以尽量不要更新整个表,如果数据量比较大,

这样性能会非常低。

对于第二种操作其实更插入操作类似,比如说将编号为7369的工作和薪金更改为与7839的相同可以这么使用

UPDATE emp SET(job,sal)=(select job,sal from emp where empno=7839) where empno=7369;

数据的删除:

形式:DELETE FROM 表 [WHERE 条件];

删除操作比较简单,在删除操作时如果不写删除条件表示删除整个表。

事物:

在ORACLE中事物的操作命令有下面几个

SET AUTOCOMMIT=OFF:关闭自动提交处理

SET AUTOCOMMIT=ON:打开自动提交处理

COMMIT:提交事物

ROLLBACK TO[回滚点]:回滚事物

SAVEPOINT 事物点名称:设置事物保存点

其中ROLLBACK可以回滚,但是它回滚是回滚到本次操作之前,如果想回滚到具体某个点,那么我们要在我们希望回滚的操作出设置一个事物点,然后通过

ROLLBACK TO 点回滚到那个点。

锁:

事物处理的核心操作就是锁,当一个SESSION操作表时将其锁住,只要此操作没有提交或者回滚那么另外的SESSION将不会知道当前SESSION的操作

锁又有行级锁和表级锁

当用户执行INSERT,UPDATE,DELETE和SELECT FOR UPDATE时,ORACLE隐式地实现了记录的锁定,这种锁称为排它锁。比如所:

第一个SESSION使用UPDATE语句更新某个雇员的工资,当第二个SESSION想更新同一个雇员信息时将一直处于等待状态。

对于表级锁定我们要手动加锁,语法规则:LOCK TABLE 表名称|视图名称,表名称|视图名称,.....IN 锁定模式 MODE[NOWAIT]

其中NOWAIT表示当视图锁定一张数据表时,如果发现已经被其他事物锁定不会等待

上面语句中的锁定模式常见的有:

ROW SHARE:行共享锁,允许其他事物并发对表进行各种操作,但不允许任何事物对同一张表进行独占操作(也就是说禁止排它锁)

ROW EXCLUSIVE:行排它锁,允许用户进行任何操作,不能防止其他事物对同一张表手工锁定或独占操作

SHARE:共享锁,其他事物只允许查询操作,不能执行修改操作

SHARE ROW EXCLUSIVE:共享排它锁,允许用户进行查询操作,不允许其他用户使用共享锁,比如说(SELECT FOR UPDATE就是共享排它锁)

EXCLUSIVE:排它锁,事物以独占方式锁定表,其他用户允许查询,但不能修改也不能设置任何的锁。

比如设置共享锁:LOCK TABLE emp IN SHARE MODE NOWAIT;此时如果第二个SESSION要对表进行修改将不会有任何结果。

当然表能锁定就能解锁,oracle中解锁时通过ALTER SYSTEM KILL SESSION 'SID,SERIAL#'操作完成的

其实SID可以通过v$locked_object数据字典查到,SERIAL#可以通过v$session数据字典查到,举例看看

第一个SESSION:select * from emp where deptno=20 FOR UPDATE

第二个SESSION:select * from emp where deptno=20 FOR UPDATE

此时第二个SESSION将处于等待状态

我们先查看数据库中的锁定情况select session_id,oracle_username,process from v$locked_object

可以看到几个SID,然后我们将根据SID在v$session数据字典中找到SERIAL#

select sid,serial#,username,lockwait,status from v$session where sid IN(上面SID1,SID2,..)

此时找到我们操作表的锁的SID和SERIAL#,解除锁定即可

ALTER SYSTEM KILL SESSION 'SID,SERIAL#'

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值