1. 事务(TRANSACTION)
1.1 定义
数据库事务是访问并可能操作各种数据项的一个数据库操作序列,这些操作要么全部执行,要么全部不执行,是不可分割的工作单位
1.2 目的
保证数据的完整性
1.3 四大特性
原子性 (Atomicity) :原子工作单元,不可分割
一致性 (Consistency) :事务结束前后,数据整体不变
隔离性 (Isolation) :多个事务独立运行,互不干扰
持久性 (Durability) :事务一旦提交,对数据的改变永久有效
1.4 事务的开始与结束
事务的开始:一条SQL、一组SQL、一个程序块
事务的结束:
'显式'结束:commit、rollback
'隐式'结束: DDL、DCL(隐含了commit)
客户端主动断开数据库的连接(disconnect)
数据库关闭,比如宕机
2. 触发器
Oracle是一种关系型数据库管理系统,它支持触发器(TRIGGERS)的概念
触发器是存储在数据库中的一段PL\SQL代码,当满足特定的条件时,它会自动触发执行
触发器通常与数据库表相关联,监视表上的数据操作(比如插入、更新、删除)并触发相应的响应动作
2.1 触发器类型
BEFORE触发器:在数据操作执行之前执行
AFTER触发器:在数据操作执行之后执行
INSTEAD OF触发器:常用于视图操作
2.2 触发器事件
触发器可以与表上的INSERT、UPDATE、DELETE事件相关联,当这些事件在表上发生时,触发器会被触发并执行相应的操作
2.3 触发器触发时机
触发器在行级别或者是语句级别触发。行级别触发器针对每一行的数据操作进行触发和执行;语句触发器在整个SQL语句执行完成后触发一次
2.4 触发器编写语法
在ORACLE中,触发器使用PL\SQL编写,触发器包括触发器名称、触发事件、触发条件和触发的PL\SQL代码块等
CREATE OR REPLACE TRIGGER TRIGGER_NAME
BEFORE | AFTER | INSTEAD OF
[INSERT | UPDATE | DELETE] [OF COLUMN_NAME [,COLUMN_NAME...]]
ON TABLE_NAME
[FOR EACH ROW]
[WHEN CONDITION]
BEGIN
--触发体,即要执行的操作
END;
2.5 触发器的应用场景
触发器可以用于实现数据完整性的约束、审计跟踪、自动计算字段值、数据转换等各种业务逻辑需求
3. 锁
在Oracle数据库中,锁(Lock)用于管理并发访问的机制,用于控制对数据库对象(如表、行、页等)的访问和操作
3.1 锁的类型
Oracle数据库支持多种类型的锁,包括共享锁(shared Lock)和排他锁(Exclusive Lock)。共享锁允许其他事务读取数据,但不允许修改数据而排他锁则限制其他事务对数据的读取和修改
3.2 锁的粒度
Oracle的锁可以应用于不同的粒度,包括表级锁、行级锁和页级锁。表级锁是针对整个表的锁,行级锁是针对表中的行的锁,页级锁是针对表中的页的锁
3.3 锁的模式
锁可以具有不同的模式,包括共享模式(shared Mode)和排他模式(Exclusive Mode)。共享模式允许多个事务同时获取共享锁,而排他模式只允许一个事务获取排他锁
3.4 锁的隔离级别
Oracle数据库支持多个隔离级别,如读未提交(Read Uncommitted)、读已提交(Read Committed)、可重复读(Repeatable Read)和串行化(serializable)。不同的隔离级别决定了事务之间锁的行为和互相的影响
3.5 锁的管理
Oracle数据库使用了多种技术来管理锁,如行级锁定(Row-level Locking)、事务管理(Transaction Management)、死锁检测(Deadlock Detection)和锁超时(ock Timeout)等
3.6 锁的影响
锁的存在可以帮助维护数据的一致性和完整性,但也可能引发并发性能问题,如死锁和锁竞争
4. 临时表补充
会话级临时表和事务级临时表
4.1 会话级临时表
只可能在当前会话范围内里使用的临时表,新开的窗口将无法获取该临时表
CREATE GLOBALTEMPORARY TABLE 临时表的名字(列名数据类型)
ON COMMIT PRESERVE ROWS;
CREATE GLOBAL TEMPORARY TABLE TMP USERS(
DL DATE,UNI NUMBER,PLATF VARCHAR2(20),EVENT VARCHAR(20)
) ON COMMIT PRESERVE ROWS;
--只有在当前执行数据插入的窗口中有效,更换窗口或者重新登录的时候,数据都会清空
--在平时的SQL语句中要使用临时表,一般都是会话级:
--示例:插入数据
INSERT INTO TMP USERS (UNI) VALUES (12);COMMIT-查询验证
SELECT *FROM SCOTT.TMP USERS;
--可以看到数据,但是你切换窗口或者切换用户之后再重新登录,再次SELECT会发现表格被清空了
4.2 事务级临时表
只能在一个事务范围内使用的临时表,比如一个代码块
CREATE GLOBAL TEMPORARYTABLE 表名(列名数据类型)
ON COMMIT DEETE ROWS;
CREATE GLOBAL TEMPORARY TABLE TMP USERS2(
DL DATE,
UNI NUMBER,
PLATF VARCHAR2(20),
EVENT VARCHAR(20)
) ON COMMIT DELETE ROWS;
--当你提交数据或者回滚数据的时候,表格的数据会被清空
--如果是在代码块里面,使用数据库编程的语句,需要用到临时表,一般就是非各级的临时表
INSERT INTO TMP_USERS2(UNI) VALUES(12):--不提交
SELECT * FROM TMP_USERS2:
COMMIT;
--SELECT 查询是有数据的,假如COMMIT或者ROLLBACK,数据就没了: