事务(transaction):是作为单个逻辑工作单元执行的一系列操作.
1、事务的特性(ACID):
原子性(Atomicity):
事务是一个完整的操作。事务的各步操作是不可分的(原子的);要么都执行,要么都不执行
一致性(Consistency):
当事务完成时,数据必须处于一致状态.
隔离性(Isolation):
对数据进行修改的所有并发事务是彼此隔离的,
它不应以任何方式依赖于或影响其他事务.
永久性(Durability):
事务完成后,它对数据库的修改被永久保持.
2、Oracle的事务控制命令:多个DML语句组成要么都成功要么都不成功;
Oracle自动开启事务:执行第一条DML语句的时候开启。
结束事务:
commit:
显示提交: commit
隐式提交: 正常退出(exit) ,执行DDL语言,执行DCL语言
rollback:
显示提交: rollback
隐式提交: 非正常退出,宕机,断电
保存点 :
设置保存点 savepoint aa(保存点名字)
回滚 rollback to savepoint aa 回滚到 aa 这个位置
注意:cmd点击“X”键退出,属于非正常退出,不保存操作数据,PLSQL工具点击退出键是正常退出,保存操作
Oracle执行语句后存储在临时表空间,提交后才会保存,提交与回滚是为解除事务
3、数据异常
(1)脏读:
当一个事务修改数据时,另一事务读取了该数据,但是第一个事务由于某种原因取消对数据修改,使数据返回了原状态,这是第二个事务读取的 数据与数据库中数据不一致,这就叫脏读。
如:事务T1修改了一条数据,但是还未提交,事务T2恰好读取到了这条修改后了的数据,此时T1将事务回滚,这个时候T2读取到的数据就是脏数据。
例:转账 A转给B 100 B去查看 账户+100 A回滚了 B的100没了。
(2)不可重复读: 两次查询中间 插入了 DML操作 (不算事故)
是指一个事务读取数据库中的数据后,另一个事务则更新了数据,当第一个事务再次读取其中的数据时,就会发现数据已经发生了改变,这就是 不可重复读取。不可重复读取所导致的结果就是一个事务前后两次读取的数据不相同。
(3)幻读:在执行更新的时候 其他人对表进行了插入 (不算事故)
如果一个事务基于某个条件读取数据后,另一个事务则更新了同一个表中的数据,这时第一个事务再次读取数据时,根据搜索的条件返回了不同的行,这就是幻读。
如:事务T1读取一条指定where条件的语句,返回结果集。此时事务T2插入一行新记录,恰好满足T1的where条件。然后T1使用相同的条件再次查询,结果集中可以看到T2插入的记录,这条新纪录就是幻读。
4、Oracle 隔离级别(默认在sql99):
ORACLE中含有2个隔离级别(非sql99标准下read only)
READ COMMITTED 读已提交的数据(默认)
SERIALIZABLE 串行化
MySql中含有4个隔离级别
READ UNCOMMITED 读未提交的数据
READ COMMITED 读已提交的数据
REPEATABLE READ 可重复读(默认)
SERIALIZABLE 串行化
Oracle还另外定义设置事务隔离级别:
set transaction read only 设置事务为只读事务
set transaction isolation level read committed 设置事务为读已提交事务
设置隔离级别
设置一个事务的隔离级别:
- SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
- SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
- SET TRANSACTION READ ONLY;
- SET TRANSACTION READ WRITE;
注意:这些语句是互斥的,不能同时设置两个或两个以上的选项。