Oracle PL/SQL 程序设计读书笔记 第14章 DML和事务管理

Oracle PL/SQL 程序设计读书笔记 - 第14章 DML和事务管理

Oracle PL/SQL 程序设计读书笔记 - 第14章 DML和事务管理

ACID原则:即一个事务具有原子性、一致性、隔离性和持久性。

  • 原子性:一个事务所涉及的改变是原子的:这些改变或者全部发生或者全部不发生。
  • 一致性:一个事务必须是一个正确的状态转换。事务中发生的行为作为一个整体不能违反状态的任何完整性约束。
  • 隔离性:很多个事务可以同时发生,不过从任何一个事务的角度来看,其他的事务看起来都是在它之前或之后发生的。
  • 持久性:一旦一个事务成功结束,状态的改变就是永久的了。可能经受住以后发生的任何故障。

14.1.1 DML语句快速入门。

共有4个DML语句:INSERT,UPDATE,DELETE,MERGE

14.1.2 DML操作游标属性

Oracle允许我们通过一些特殊的隐式游标属性访问最后一次运行的隐式游标的信息。 首先,记住隐式游标属性的值总是属于最后一次执行的SQL语句,而不管隐式游标是哪一个块中执行的。

  • SQL%FOUND 如果有一行或者多行记录被成功修改返回TRUE
  • SQL%NOTFOUND 如果DML语句没有修改任何行则返回TRUE
  • SQL%ROWCOUNT 返回被DML语句修改的记录行数
  • SQL%ISOPEN 对于隐式游标总是返回FALSE,因为ORACLE数据库会自动打开和关闭这些游标。

14.1.3 从DML语句返回信息

  • 可以在DML语句中加处RETURNING子句,而获得DML所操作的信息。可以通过BULK COLLECT语句返回一个集合。
  • 可以通过关键字ROW对一整条记录进行更新。

14.2 事务管理

14.2.1 COMMIT语句

COMMIT [WORK][COMMENT text];
  • WORK 是一个可选的关键字,主要用于改善代码的可读性。

14.2.2 ROLLBACK语句

ROLLBACK [WORK][TO [SAVEPOINT] savepoint_name]

14.2.3 SAVEPOINT语句

SAVEPOINT savepoint_name;

14.2.4 SET TRANSANCTION命令

  • SET TRANSACTION READY ONLY;

把当前事务定义成只读的

  • SET TRANSACTION READ WRITE;

把当前的事务定义成可读写的,并且这也是缺省的设置。

  • SET TRANSACTION ISOLATION LEVEL SERIALIZABLE | READ COMMITTED;
  • SET TRANSACTION USE ROLLBACK SEGMENT rollback_segment;

14.2.5 LOCK语句

LOCK TABLE table_reference_list IN lock_mode MODE [NOWAIT];

14.3 自治事务

如果把一个PL/SQL块定义成自治事务的,我们实际是把这个块中的DML语句和调用程序的事务环境完全的隔离开。这个块就成为一个由其他事务启动的独立的事务,前一个事务就被叫做主事务。

14.3.1 定义自治事务

PRAGMA AUTONOMOUS_TRANSACTION;

在声明单元加上上面语句就可以了。

14.3.2 自治事务的规则和限制

  • 如果自治事务要访问的资源已经被主事务持有,我们的程序就发生了死锁。
  • 我们不能只用一个PRAGMA声明就把一个包中的所有子程序全部标志成自治的。我们必须对位于包体的每个程序的声明单元都明确地指定自治事务。这个规则的一个后杲就是我们无法通过包规范来区分到底哪一个程序是自治事务的。
  • 如果想从一个已经执行了至少一个DML语句的自治事务程序没有任何错误的退出,我们必须明确地执行一个提交或者回滚。
  • COMMIT和ROLLBACK语句只是结束了活动的自治事务,但不会终止自治例程。
  • 我们只能回滚到当前会话内创建的保存点。如果是在一个自治事务中,我们就不能回滚到主事务创建的保存点。
  • 数据库参数文件中的TRANSACTIONS参数指定的是一个会话内可以并发的最大事务数量。默认是75。

14.3.3 事务的可见性

自治事务的缺少行为是,只要在自治事务中执行了COMMIT或者ROLLBACK,这些改变立即就对主事务可见。但如果这些改变后的信息不应该在主事务中看到。

SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;

14.3.4 什么时候使用自治事务

  • 日志机制
  • 在数据库触发器中执行提交和回滚
  • 可重用的应用组件
  • 避免查询时出现突变表触发器错误
  • 在修改这个表的SQL中调用用户自定义函数
  • 重试计数器
原文地址:https://www.cnblogs.com/tjpanda88/p/2287042.html