事务、触发器、锁、临时表补充

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,数据就没了:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值