您的位置:首页 > 数据库

Ch4 PL/SQL数据更改和管理事务

2014-08-26 21:32 477 查看
DML 隐式游标(如下) 单行DQL 隐式或显式游标 多行DQL 显式游标

隐式游标

  %FOUND 指出了当PL/SQL代码最后从游标的结果集中获取记录时,找到了记录。

  %NOTFOUND 指出了当PL/SQL代码最后从游标的结果集中获取记录时,结果集中没有记录。

  %ROWCOUNT 返回当前时刻还没有从游标中获取的记录数量。

  %ISOPEN 对于隐式游标而言,属性%ISOPEN的值总是false,这是因为隐式游标在DML语句执行时打开,结束时就立即关闭。

下右图中可以returning代替return,效果一样

若集合类型returning a(单量) bulk collect into b(集合类型,不加下标) 再用for indx in b.first..b.last 得到b.(indx)的值



批量DML——forall 下右边效率高 其隐式游标一样 但影响1到多则true



数据库事务

一组SQL语句组成的一个逻辑单元看作数据库事务,具有(ACID)原子性(atomicity) 、一直性(consistency)、隔离性(isolation) 、持久性(durability)。若一个事务有问题则所有回滚(rollback),所有成功则提交(commit),提交后不可回滚。

事务处理:1、开始事务DML和DQL 2、执行SQL语句 3、提交事务,DDL、DCL自动提交,commit或commit commit a;(少于50字符)

4、回滚事务,可以savapoint a;在rollback to savapoint a;

数据库中的锁 1内部锁或闩(自动创建和释放) 2、DDL锁(使用时自动创建) 3、DML(事务开始时创建)

锁描述解释SQL操作
S(Share)共享锁Create index、Lock share 如:Lock Table TableName In Share Mode

X(Exclusive)排它锁Alter table、Drop able、Drop index、Truncate table 、Lock exclusive 如:Lock Table TableName In Exclusive Mode;

RS(Row-S)行级共享锁,其他对象只能查询这些数据行Select for update、Lock for update、Lock row share 如:LOCK TABLE TableName IN ROW SHARE MODE;
SX(Row-X)行级排它锁,在提交前不允许做DML操作Insert、Update、Delete、Lock row share 如:LOCK TABLE TableName IN ROW EXCLUSIVE MODE;
SSX(S/Row-X)共享行级排它锁Lock Table TableName In Share Row Exclusive Mode;
锁粒度 行级锁(TX) 表级锁(TM) 数据库级锁
事务隔离级别 有效保证并发读取数据的正确性

脏读(Dirty Reads)一个事务开始读取了某行数据,但是另外一个事务已经更新了此数据但没有能够及时提交。

不可重复读(Non-repeatable Reads)一个事务对同一行数据重复读取两次,但是却得到了不同的结果。

1、未授权读取 也称为读未提交(Read Uncommitted):允许脏读取,但不允许更新丢失。如果一个事务已经开始写数据,则另外一个数据则不允许同时进行写操作,但允许其他事务读此行数据。该隔离级别可以通过“排他写锁”实现。

2、授权读取 也称为读提交(Read Committed):允许不可重复读取,但不允许脏读取。这可以通过“瞬间共享读锁”和“排他写锁”实现。读取数据的事务允许其他事务继续访问该行数据,但是未提交的写事务将会禁止其他事务访问该行。oracle支持

3、可重复读取 可重复读取(Repeatable Read):禁止不可重复读取和脏读取,但是有时可能出现幻影数据。

4、序列化(Serializable)或可串行读:提供严格的事务隔离。它要求事务序列化执行,事务只能一个接着一个地执行,但不能并发执行。 oracle支持

防止死锁 1、最低事务隔离 2、保持事务尽可能短 3、事务内部按一定顺序访问数据库对象 4、等待用户输入时不要让事务持续打开
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: