1、事务处理:
1.1、事务处理要确保数据操作的一致性。一个事务必须满足原子性、一致性、隔离性、持久性。
原子性:对数据进行修改,要么全部成功,要么全部失败
一致性:所有数据都保持一致状态,即所有数据都要发生改变
隔离性:两个事务互不干扰,一个事务不能看到其他的事务运行
持久性:一旦事务被提交了数据的变化就会保存下来,不会丢失
1.2、事务有3种情况会结束:
①、当遇到COMMIT或者ROLLBACK时,将会提交或者回滚事务
②、当用户退出Oracle工具时,比如退出Toad时
③、当机器失效或者系统崩溃时
1.3、PL/SQL提供语句用于管理事务
①、COMMIT:保存上一次COMMIT或ROLLBACK以来的所有改变,并且释放所有的锁
②、ROLLBACK:回滚所有自上一次COMMIT或ROLLBACK以来的所有改变,并且释放所有的锁
③、ROLLBACK TO SAVEPOINT:回滚所有的改变到一个已经保存的保存点,并且释放所有该范围的锁
④、SAVEPOINT:建立一个保存点,允许完成局部的回滚操作
⑤、SET TRANSACTION:允许开始一个只读或读写会话,建立一个隔离级别,或者是将当前的事务赋给一个特定的回滚段
⑥、LOCK TABLE:允许使用特定的模式锁定整个数据库表,这将覆盖默认的行级别的锁定
使用COMMIT提交事务
1 DECLARE 2 dept_no NUMBER (2) := 70; 3 BEGIN 4 --开始事务 5 INSERT INTO dept VALUES (dept_no, '市场部', '深圳'); 6 INSERT INTO emp VALUES (7997, '张三', '男', 18, '高三(1)班'); 7 --提交事务 8 COMMIT; 9 END;
使用ROLLBACK回滚事务
1 DECLARE 2 dept_no NUMBER (2) := 70; 3 BEGIN 4 --开始事务 5 INSERT INTO dept VALUES (dept_no, '市场部', '深圳'); 6 INSERT INTO emp VALUES (7997, '张三', '男', 18, '高三(1)班'); 7 --提交事务 8 COMMIT; 9 EXCEPTION 10 WHEN DUP_VAL_ON_INDEX THEN --捕捉异常 11 DBMS_OUTPUT.PUT_LINE(SQLERRM); --显示异常信息 12 ROLLBACK; --回滚异常 13 END;
使用SAVEPOINT保存点
1 DECLARE 2 dept_no NUMBER (2) := 70; 3 BEGIN 4 --开始事务 5 SAVEPOINT A; 6 INSERT INTO dept VALUES (dept_no, '市场部', '深圳'); 7 SAVEPOINT B; 8 INSERT INTO emp VALUES (7997, '张三', '男', 18, '高三(1)班'); 9 SAVEPOINT C; 10 INSERT INTO dept VALUES (dept_no, '市场部', '深圳'); 11 --提交事务 12 COMMIT; 13 EXCEPTION 14 WHEN DUP_VAL_ON_INDEX THEN --捕捉异常 15 DBMS_OUTPUT.PUT_LINE(SQLERRM); --显示异常信息 16 ROLLBACK TO B; --回滚异常 17 END;
1.3.1、SET TRANSACTION设置事务属性
SET TRANSACTION语句允许开始一个只读或只写的事务,建立隔离级别或者是为当前事务分配一个特定的回滚段
SET TRANSACTION语法:
①、SET TRANSACTION READ ONLY;
READ ONLY:建立只读事务,在这个事务中执行任何INSERT,DELETE,UPDATE或SELECT FOR UPDATE等命令都属于非法操作
②、SET TRANSACTION READ WRITE;
READ WRITE:建立读写事务,读写事务没有只读事务的种种限制,不仅可以执行SELECT,还可以执行INSERT,DELETE,UPDATE
③、SET TRANSACTION ISOLATION LEVEL;
ISOLATION LEVEL:用来设置事务隔离级别,即规定在事务中如何处理DML事务,可以设置SERIALIZABLE和READ COMMITTED这两个选项
2、使用锁定
2.1、理解锁:
在使用某个数据前,可以锁定表中的某行,保证他们在更新或者删除之前不会发生改变
语法:SELECT ...... FOR UPDATE
锁分为两种:
①、记录锁定:又称为行锁,对当前操作的一行进行锁定,锁定总是以独占的方式进行,在一个事务结束之前,其他事务将要等待该事务结束才能访问
②、表锁定:对整个表进行锁定,以确保当前事务可以访问数据,但是防止其他的会话或者事务同时对该表进行访问而造成的冲突,用于保护整张表
2.1.1、记录锁定:
Oracle隐式实现记录锁定,当执行INSERT,DELETE,SELECT FOR UPDATE语句时,将进行记录锁定,这种锁称为互斥锁,也称为排他锁
SELECT * FROM emp WHERE deptno=10 FOR UPDATE;
2.1.2、表锁定:
Oracle默认不会进行表锁定,使用LOCK TABLE语句把整张表用指定的锁模式进行锁定,这样就能共享或拒绝对这个表的访问
常见的几种表锁定模式
①、ROW SHARE:行共享锁,这是一种最小限制的锁定,在锁表同时允许别的事务并发对表进行SELECT,INSERT,UPDATE,SELECT FOR UPDATE,DELETE以及LOCK TABLE,
他不允许任何事务对同一个表进行独占的写访问
②、ROW EXCLUSIVE:行排它锁,当一个表的多条记录被更新时,也允许别的事务并发对表进行SELECT,INSERT,UPDATE,SELECT FOR UPDATE,DELETE以及LOCK TABLE,
但是与行共享锁不同的是它不能防止别的事务对同一个表的手工锁定或独占式的读与写
③、SHARE LOCK:共享锁,只允许别的事务查询或锁定特定的记录,防止任何事务对同一张表的插入、修改和删除
④、SHATE ROW EXCLUSIVE:共享排它锁,用于 查看整个表,也允许别的事务查看表中的记录,但是不允许别的事务以共享模式锁定或更新表中的记录,这种锁一般只允许
SELECT FOR UPDATE
⑤、EXCLUSIVE:排它锁,该事务以独占方式写一个表,允许别的用户读取和查询,但是不允许进行任何的INSERT,UPDATE,DELETE
1 LOCK TABLE emp IN SHARE MODE; 2 LOCK TABLE emp IN EXCLUSIVE MODE NOWAIT; 3 LOCK TABLE emp IN SHARE UPDATE MODE; 4 LOCK TABLE emp IN ROW EXCLUSIVE MODE NOWAIT; 5 LOCK TABLE emp IN SHARE ROW EXCLUSIVE MODE; 6 LOCK TABLE emp IN ROW SHARE MODE NOWAIT;
*如果要解除使用LOCK TABLE语句的锁定,只需简单的COMMIT或者ROLLBACK即可。