事务
1、是一种极致、一个操作序列,是数据库工作的逻辑单元
2、有一个或多个完成一组相关行为的相关的SQL组成
3、是一个不可分割的单元
常用控制语句
COMMIT 事务提交
ROLLBACK 事务回滚
特性 ACID
原子性 事务是一个完整的操作,事务各步操作是不可分的
要么都执行,套么都不执行
一致性 事务操作前后,数据处于一致状态
隔离性 对数据进行修改的所有事物彼此隔离的,事务
必须是独立的,不依赖于或影响其他事务
即,事务处理中,其他食物不能访
问该事务的数据
读取数据时的异常
脏读 一个事物读取另一个失误未提交的数据
不可重复读取 一个事物再次读取之前曾经读过的数据时
发现该数据已经被另一个提交的事务更改
幻读 一个事务根据相同的查询条件,重新自行
查询,返回记录中包含的与前一次执行查
询的记录不同的行
事务隔离级别
Read Uncommitted,oracle不支持
保证不会读到非法数据
Read Committed
保证了一个事物不会读到另一个并发事务修改但未
提交的数据
Repeatable Read,oracle不支持
此级别的事务隔离避免了了脏读和不可重复读的异常
,一个事务不可能更新已经由另一个失误读取但未提
交的数据
Serializable
最高级别,三种全可以避免
Read Only
不能有任何修改数据库中数据的语句以及修改修改
数据库结构的语句
持久性 事务完成后对数据库的修改永久保存
应用
BEGIN
--执行语句
COMMUT;
EXCEPTION
WHEN OTHERS THEN ROLLBACK
END;
使用
事务开始
oracle中不需要专门的语句。是隐式的,事务在修改数据的第一条语
句处开始
事务结束
1、COMMIT和ROLLBACK提交或者回滚事务
2、在DDL前面的DML,提交事务
3、断开连接,自动提交
4、用户进程意外终止,回滚
事务控制语句
COMMIT=COMMIT WORK 提交事务
ROLLBACK=ROLLBACK WORK 回滚事务
SAVEBACK 在事务中创建存储点
SAVEPOINT [SavePoint_Name]
ROLLBACK TO <SavePoint_Name> 将事务回滚到存储点
ROLLBACK TO [SavePoint_Name]
SET TRANSACTION 设置事务属性
必须是事务的第一条语句
可以设置的属性
1、隔离级别 SET TRANSACTION + 隔离级别
2、回滚使用的空间
3、事务命名
//==========SAVEBACK、ROLLBACK TO使用实例===============
--数据库操作
SAVEPOINT SavePoint_Name
--希望回滚的操作
COMMIT
EXCEPTION
WHEN others THEN
ROLLBACK TO SavePoint_Name
END
并发控制
问题
丢失更新: 一个事物修改数据时,另一个失误同时修改了改行的
数据,使第一个更新修改丢失
脏读: 一个事物读取另一个失误未提交的数据
不可重复读取: 一个事物再次读取之前曾经读过的数据时
发现该数据已经被另一个提交的事务更改
幻读: 一个事务根据相同的查询条件,重新自行
查询,返回记录中包含的与前一次执行查
询的记录不同的行
锁机制
用来共享资源控制并发访问的一种机制
1、由Oracle自动管理,所的持续时间是被提交事务处理的时间
2、单用户数据库不需要锁机制
锁分类
1、共享锁
可以被其他事物读取,不能修改
2、排他锁
不能被其他事务读取和修改
按保护的内容
1、DML锁: 用来保护数据完整性
行级锁(TX锁): 在事务发起第一个修改语句时,会得到TX锁,直到
提交或者回滚
表级锁(TM锁): 在一个会话修改表时自动获取,避免表结构的改变
2、DDL锁: 用来保护数据对象结构的定义
DDL执行时会先执行COMMIT,在执行后后执行COMMIT
3、内部锁和闩 用来保护数据库内部结构
常见问题
1、死锁问题 两个事物进入等待对方锁定的资源时的停止状态
解决 一个会话回滚,另一个事物继续执行
2、阻塞问题 一个会话持有某个资源的锁,另一个请求这些资源
解决 使用锁定
锁定
悲观锁 读取数据后马上锁定相关资源
语法:SELECT... FOR UPDATE [OF column_list] [WAIT n|NOWAIT]
OF字句用于指定即指定将更新的列,即锁定行上的待定列
WAIT字句指定等待其他用户释放的秒数,防止无限制等待
NOWAIT表示不等待
指定读取数据后马上锁定相关资源
SELECT... FOR UPDATE
UPDATE...
COMMIT;
直到COMMIT才解锁
乐观锁
把所有锁定都延迟到即将更新之前
语法:利用update的where判断update时数据有无被更改
UDPATE table SET key1 = newvalue1 where key2 = oldvalue2;