事务
指某些逻辑单元操作统一为一组,这组操作要么都完成,要么都不完成。
目的是为了数据的安全,有效,符合逻辑。
--------从提交事务结束 到第二次提交事务结束,之间的所有逻辑操作单元都统一为一组
事务有以下几个特点
- 原子性:所有事务的执行,要么都完成,要么都不完成。
- 一致性:事务完成时,要求所有数据都有一致的状态。即:通过事务对表进行修改,必须在所有相关表中都有反应。
- 隔离性:事务应该在另一个事务对数据修改前或修改后进行访问。即不能有两个同时进行的事务。事务提交了才可以让别的客户端读取到
- 持久性:保证通过事务修改的数据是持久有效的。即使发生系统故障也不应该丢失。
事务发生并发问题时有以下几个隔离的级别
- 丢失更新:两个事务进行同时存储。但可能只有一个事务成功了。另一个事务的操作丢失。
- 脏读 : 事务1更新的一组操作,但是还没进行提交,事务2 就读取到了事务1更新后的操作。如果这个时候事务1回滚。那么事务2读取的数据无效,这类数据被称为脏读。
- 不可重复读: 事务1读取了一行数据,同时事务2修改了这行数据,事务1再取读的时候发现记录的第一次不同,这样被称为不可重复读(重复读会有问题)
- 幻读: 事务1 用where方式读取多行数据,此时事务2修改了数据,且数据修改后恰好满足了事务1的where条件。当事务1再次查询的时候,在结果集中看到了事务2修改后的数据。新记录被称为幻读。
- 读未提交——并发时,事务1还未提交的数据也可以被读取到
- 读已提交——只有提交了的事务才可以被其他事务读取到。
- 可重复读——事务1进行的时候读取的时候,对事物一进行事务2 不能进行修改操作。
- 串行读——事务只能一个接一个地执行,不能并发执行。性能特别低
Oracle默认时 read committed级别
Oracle 支持上述四种隔离级别中的两种:read committed 和serializable
Oralce 中还定义 Read only 和 Read write 隔离级别
Read write:它是默认设置,该选项表示在事务中可以有访问语句、修改语句,但不经常使用
Read only:事务中不能有任何修改数据库中数据的操作语句
事务的开启
自动开启于 DML 操作的 insert delete update 语句
事务的结束
成功
- 正常执行完成的 DDL语句:create、alter、drop
- 正常执行完的DCL语句 GRANT、REVOKE
- 正常退出的SQL客户端 如:SQLPlus
- 隐式事务,SET AUTOCOMMIT ON
- commit ——提交操作
事务失败
-
非法退出 意外的断电
-
rollback——手动回滚操作