事务 ●事务(Transaction)是对数据库的若干操作组成的一个执行单元。这些操作要么全部执行,要么都取消,从而保证了数据库满足一致性的要求 通常,事务是有一组SQL语句组成,包括查询语句和DML(数据操纵语句Data Manipulation Language)语句。 当然,事务也可以是一个SQL语句 ●事务的ACID四大特性: (1)原子性(Atomicity):事务中包含的操作要么全部都做,要么全部都不做。 (2)一致性(Consistency):事务成功执行的结果必须是使数据库从一个状态转变到另一个状态,前后保证数据库的完整性约束, 一旦操作数据库的过程当中出现故障,事务提交回滚,恢复数据。 (3)隔离性(Isolation):一个事务的执行不会被其他的事务所干扰。即一个事务内部的操作及使用的数据对其他并发事务是隔离的,并发执行的各个事务之间不能相互干扰。 (4)持续性(Durability):也称持久性,只一个事务一旦提交,它对数据库中的数据改变是永久性的,后续的其他操作或者故障不影响其执行的结果。 ●事务的开始: 当执行了一条查询语句或者DML语句,此时便自动开启一个事务 ●事务的结束: 执行了commit或者rollback语句; 使用Exit命令退出SQLPlus时,自动的提交事务 ●并发事务: 多个用户同时和同一个数据库交互,每个用户各自运行在自己的事务中,称为并发事务 并发事务可能存在的问题: 假设有两个事务T1和T2同时对同一个表进行操作 (1)幻读:T1开始检索表中的数据,之后T2又向表中的插入或删除了一条数据,T1有基于同样的查询条件来检索该表,发现多出来一条或少一条数据 (2)不可重复读:T1读取了某条数据,然后T2修改了刚刚T1读取的这条数据,T1又读取了这条数据,结果发现这条记录和刚刚读取的这条数据不一样 (3)脏读:T1修改了某条记录,然后T2读取了刚刚T1修改的这条记录,然后T1回滚了这条记录,T2拿到的就是脏数据(无效数据) ●为了避免上述问题,SQL标准汇总定义了不同的事务隔离级别,从低往高一次为: Read Committed:事务T1只读取事务T2提交后的数据,这个级别的隔离性避免了脏读,但不可避免幻读和不可重复读问题; Read Repeatable:事务T1中读取到的数据是一致性的,即使在T2中修改了该条数据。这个隔离级别避免了不可重复读和脏读; Serializable:事务T1和T2的执行效果等效于串行(前面并发事务出现的问题几乎对它不可见) Oracle只支持两种事务隔离级别:Read Committed 和 Serializable,并且Oracle中事务默认的隔离级别是:Read Committed ●改变当前会话的事务隔离级别: alter session set isolation_level = [levelName]; Serializable级别是因为该关系型数据库管理系统为当前用户所对应模式下的数据进行了备份(放入缓冲区当中),然后其他事务修改记录,对于该用户所获取的数据就会先从缓冲区中拿到,数据依然没有修改;数据库管理系统也会为记录标记,其他事务没有提交,则该用户操作此条记录,也不允许提交!(例:并发事务操作同一个表中的同一条记录)