什么是事务?
在数据库中,事务是工作的逻辑单元。一个事务可以是一个SQL语句,也可以是多个完成一系列操作的SQL语句。事务机制是确保这些SQL语句要么全部成功执行,完成整个逻辑单元,要么一条也不执行。
事务特性(ACID)
- 原子性(atomicity):一个事务中所包含的SQL语句是一个整体,要么全部执行,要么全部不执行;
- 一致性(consistency):事务开始前,数据是一致的(注:一致性的,是指符合业务逻辑),事务结束后,数据要保持一致;
- 隔离性(isolation):数据库允许多个事务同时开始,对数据进行读写或更新。事务并发执行,交叉执行,可能会导致数据不一致。事务隔离性就是为了避免这种问题。
- 持久性(duribility):事务结束后,它对数据的影响是永久的,无论遇到什么情况,数据都不会丢失。
数据异常
- 脏读:A事务先修改了数据,B事务立即读取了该数据,但是由于某种原因,A事务又撤销了修改动作(注意:A事务没有提交事务,所以能够撤销操作),数据回到原来状态。那么B事务读取的数据跟库中的不一样,就叫脏读。
- 不可重复度:A事务先读取了一条数据之后,B事务紧跟着修改了该数据,并且提交了,A事务再去读,读到的是B事务修改之后的,跟第一次读到的不一样,就叫不可重复读。简而言之,一个事务两次读到的数据不一样。
- 幻读:A事务根据某个条件读了一条数据之后,B事务给表中插入一条,并且满足A事务读取的条件,A事务再以同样的条件去读,返回了两条记录,就叫幻读。(一条,两条都是打个比方,就是不同的行。)
注:
脏读和不可重复读的区别: 脏读是读到了未提交的数据,不可重复读是读到了前一个事务提交的修改的数据;
不可重复读和幻读的区别: 不可重复读和幻读都是读到了前一个事物提交的数据,不同点在于,不可重复读的判断标准:就数据而言,是表中的某一行,就操作而言,是UPDATE;幻读的判断标准,就数据而言,是整张表的某一批数据,就操作而言,是INSERT。(很重要)
隔离级别
读未提交(Read UnCommmint):最低级别,无法避免任何数据异常。
读已提交(Read Commint):可避免脏读。
可重复读(Repeatable Read):可避免脏读、不可重复读。
串行(Serializable):可避免脏读、不可重复读、幻读。
ORACLE支持的事务
- 读已提交
- 串行
开始事务
ORACLE开始事务都是隐式的,当连接到数据库、执行每个DDL、DML、DCL语句,ORACLE都会自动开启事务。
结束事务
执行COMMIT、ROLLBACK,当前事务就会结束,如以下情况:
- 断开/退出数据库连接,ORACLE自动执行COMMIT;
- 执行DDL、DCL语句,ORACLE自动执行COMMIT;
- SQL*PLUS,用户输入EXIT命令,ORACLE自动执行COMMIT;
- 进程意外终止,ORACLE自动执行ROLLBACK;
- SQL*PLUS,意外终止,ORACLE自动执行ROLLBACK;
- DML语句执行成功,用户手动执行COMMIT、ROLLBACK;
- DML语句执行失败,ORACLE自动执行ROLLBACK;
显式事务、隐式事务
显式事务:用户手动执行COMMIT、ROLLBACK;
隐式事务:ORACLE系统自动执行COMMIT、ROLLBACK;
事务控制语句
COMMINT:提交事务,持久保存对数据库的操作;
ROLLBACK:回滚事务,取消对数据库的任何操作;
SAVEPOINT:保存点,在事务某个状态设置一个点,回滚时可以回滚到这个特定的点,而不是将整个事务撤销;
SET TRANSACTION:设置事务属性,值如下: