Oracle数据库精讲(六)事务操作与隔离级别

事务

概念:作为单个逻辑工作单元执行的一系列操作。
四大特性:ACID
Atomicity原子性:要么都成功,要么都失败
Consistency一致性:事务执行前后,总量保持一致
Isolation隔离性:各个事务并发执行时,彼此独立
Durability持久性:持久化操作

事务的生命周期
MySQL:自动提交,自动将每一条DML语句直接commit
Oracle:手工提交

事务的开始标识:第一条DML
事务的中间过程:各种DML操作
结束有两种:
a.提交(两种) i.显示提交:commit,ii.隐式提交(自动提交):正常退出exit(ctrl+c)、DCL(grant…to…,revoke…from…)、DDL(create…,drop…)
b.回滚(两种) i.显示回滚:rollback,ii.隐式回滚:异常退出(宕机、断电)

保存点
语法:savepoint 保存点名字

可以通过设置保存点选择要回退的地方
直接rollback会回退到事务开始之前。
通过 rollback to savepoint 保存点名字; 回退到某个保存点

事务的隔离级别

多个事务会产生很多并发问题:
1.脏读:当一个事务正在访问数据,并对此数据进行了修改(1→2),但是这种修改【还没有提交到数据库(commit)】;此时,另一个事务也在访问这个数据。
本质:某个事务(客户端)读取到的数据是过时的。
2.不可重复读:在一个事务(客户端)内,多次读取同一个数据,但结果不同。
本质:就是事务A拿到了被其他事务B修改并提交后的数据。
3.幻读(虚读):在一个事务(客户端)内,多次读取同一批数据,但结果不同(比如查询出一批数据,然后有人插入2条数据,再查数据记录增加了,就产生了幻读)

不可重复读和幻读的区别:

  1. 不可重复读指的是对于 “ 同一条 ” 数据的查询操作 a→b,幻读对于 “ 多条数据 ” 的查询操作,数据量数:20条→22条
  2. 不可重复读是针对于:update;幻读是针对于:insert/ delete

SQL99标准定义的四种隔离级别

隔离级别 简介 脏读 不可重复读 幻读
Read uncommitted读未提交 允许事务读取未被其他事务提交的变更
Read committed读已提交 只允许事务读取已经被其他事务提交的变更 ×
Repeatable read可重复读 确保事务可以多次从同一个字段中读取相同的值。并且在这个事务期间,禁止其他事务对这个字段进行更新 × ×
Serializable序列化 确保事务可以从一个表中读取相同的行,并且在这个事务期间,禁止其他事务对该表执行DML操作 × × ×

四种隔离级别的程度依次递进(解决并发的效果,越来越稳定),但是性能越来越低。并发性、可用性本身就是矛盾的。

Oracle只支持其中两种:Read Committed(默认),Serializable (oracle自身扩充了一种:read only,实际read only隶属于Serializable级别)
MySQL全支持四种隔离级别。

切换隔离级别:

set transaction isolation level Serializable;
//切换read only
set transaction read only;

你可能感兴趣的:(Oracle)