事务(Transaction)
事务是由一组(多条) SQL语句组成的最小逻辑工作单元
事务是为了保证数据的一致性
-
事务的提交和回滚
- 要永久性的记录记录事务中的SQL语句的结果,需要执行commit语句,从而提交事务. 事务的开始于结束:
-
开始: 连接到数据库上,并执行一条DML语句(insert,update或delete)
前一个事务结束后,又输入一个DML语句
事务结束:
-
执行commit 或 rollback语句
执行commit或rollback语句
执行一条DDL语句,create table ,都会自动提交commit
断开数据库的连接,退出SQL plus时,输出exit的时候 都会被commit
如果SQLplus 被意外终止了,计算机蓝屏,会自动执行rollback语句
执行一条DML语句,该语句失败,这种情况,会执行rollback语句
只有DML存在事务的概念,DDL,和DCL没有事务的概念,执行就被提交
-
设置保存点:
-
保存点就是事务中的标记,把一个较长的事务分成多个较短的事务.
可以回滚到指定的保存点
savepoint savepoint_name
事务的ACID特性
-
- 原子性(Atomic) : 事务是原子的,这就是说事务中包含的所有SQL语句都是一个不可分割的工作单元
- 一致性(Consist) 事务必须确保数据库的状态保存一致,事务开始时,数据库状态是一致的,事务结束时,数据库的状态也必须是一致的
- 隔离性(Isolated) 多个事务可以独立运行,而不会彼此影响
- 持久性(Durable) 一旦事务被提交后,数据库的变化就会被永久记录,及时数据库软件崩溃.
并发事务
-
数据库支持多个用户同时对数据库进行交互,每个用户都可以同时运行自己的事务,这种事务就别称为并发事务;
用户同时运行多个事务,而这些事务对同一张表产生影响,那么这些事务是相互独立的.
直到执行一条commit才会彼此产生影响
事务锁
-
当多个事务对同一条数据进行操作的时候,就会产生事务锁.
第二个事务必须等待第一个事务释放该锁(提交/回滚);
并发事务会产生的问题:
事务隔离级别
-
是一个事务对数据库的修改与并行的另外一个事务的隔离程度
两个并发事务T1和T2正在访问相同的行数据
幻象读取:
事务T1读取一条指定的where语句返回的结果集,然后事务T2新插入一行数据,这行恰好可以满足T1查询的where条件.然后T1又使用相同的查询再次对表进行查询,但此时看到了事务T2刚才插入的新行,这个新行就称为"幻象"
不可重复读:
事务T1读取一行数据,紧接着T2修改了T1刚才读取的哪一行数据.然后T1再次读取的时候,
发现刚才读取的结果不同的了.这种现象称为 " 不可重复读".
脏读:
事务T1更新了一行数据,但是并没有提交所修改的内容,事务T2读取更新后的行,然后T1回滚操作,
取消了刚才所做的修改,先T2所读取的行就无效了.这种现象"脏读".
因为在T2读取这行数据的时候,T1所做的修改并没有提交.
隔离级别 从低到高
read uncommitted 幻读,不可重复读和脏读都允许
read committed 允许幻读和不可重复读,但是不允许脏读
reoeatabke read 允许幻读,但是不允许不可重复读和脏读
serializable 幻象读,不可重复读和脏读都不允许
Oracle 数据库只支持read committed和serializable两种事务隔离级别.
set transaction isolation level
{
read committed|
serializable
}