索的条件返回了不同的行,这就是假读。
事务中遇到的这些异常与事务的隔离性设置有关,事务的隔离性设置越多,异常就出现的越少,但并发效果就越低,事务的隔离性设置越少,异常出现的越多,并发效果越高。
选择隔离层
oracle心得5--oracle的增删改查@oracle的事务处理@案例分析(二)
针对3中读取的数据时产生的不一致现象,在ANSI SQL标准92中定义了4个事务的隔离级别.如下所示:
隔离层
错读|脏读
非重复读取|不可重复读
假读|幻读
READ UNCOMMITTED(非提交读)
是
是
是
READ COMMITTED(提交读)
否
是
是
Repeatable READ(可重复读)
否
否
是
Serializable(串行读)
否
否
否
Read committed 这是oracle默认的隔离层。 Oracle支持上述四种隔离层中的两种:read committed 和serializable。除此之外oralce中还定义read only 和 read write隔离层。
隔离层
错读|脏读
非重复读取|不可重复读
假读|幻读
READ UNCOMMITTED(非提交读)
是
是
是
READ COMMITTED(提交读)
否
是
是
Repeatable READ(可重复读)
否
否
是
Serializable(串行读)
否
否
否
Read committed 这是oracle默认的隔离层。 Oracle支持上述四种隔离层中的两种:read committed 和serializable。除此之外oralce中还定义read only 和 read write隔离层。
Serializable:设置事物的隔离层位它时,事务与事务之间完全隔开,事务以串行的方式执行,这并不是说一个事务必须结束才能启动另外一个事务,而是说这些事务的执行的结果于一次执行的事务的结果一致。
Read only和 read write 当使用read only时,事务中不能有任何修改数据库中数据的操作语句,这包括 insert、update、delete、create语句。Read only是serializable的一个子集,区别是read only 只读,而serialzable可以执行DML操作。Read write它是默认设置,该选项表示在事务中可以有访问语句、修改语句.但不经常使用.
建立set transaction的语句
列举如下:
Set transaction read only
Set transaction read write
Set transaction isolation level read committed
Set transaction isolation level serializable
注意:这些语句是互斥的.即不能够同时设置两个或者两个以上的选项。
结束事务:
什么情况下代表事务的结束呢
Commit 提交事务
rollback 回滚事务
11.只读的案例
[sql]
SQL> set transaction read only;
Transaction set
SQL> select * from users where username='mj';
USERNAME PASSWORD NAME ADDRESS ZIP
-------------------- -------------------- -------------------- -------------------- -------
mj redarmy 陈红军
SQL> update users set password='123' where username='mj';
update users set password='123' where username='mj'
ORA-01456: 不能在 READ ONLY 事务处理中执行插入/删除/更新操作
//脏读的案例
SQL> set transaction isolation level read committed;
Transaction set
SQL> select * from users where username='mj';
USERNAME PASSWORD NAME ADDRESS ZIP
-------------------- -------------------- -------------------- -------------------- -------
mj redarmy 陈红军
SQL> update users set password='123' where username='mj';
1 row updated
SQL> select * from users where username='mj';
USERNAME PASSWORD NAME ADDRESS ZIP
-------------------- -------------------- -------------------- -------------------- -------
mj 123 陈红军
SQL> rollback;
Read only和 read write 当使用read only时,事务中不能有任何修改数据库中数据的操作语句,这包括 insert、update、delete、create语句。Read only是serializable的一个子集,区别是read only 只读,而serialzable可以执行DML操作。Read write它是默认设置,该选项表示在事务中可以有访问语句、修改语句.但不经常使用.
建立set transaction的语句
列举如下:
Set transaction read only
Set transaction read write
Set transaction isolation level read committed
Set transaction isolation level serializable
注意:这些语句是互斥的.即不能够同时设置两个或者两个以上的选项。
结束事务:
什么情况下代表事务的结束呢
Commit 提交事务
rollback 回滚事务
11.只读的案例
[sql]
SQL> set transaction read only;
Transaction set
SQL> select * from users where username='mj';
USERNAME PASSWORD NAME ADDRESS ZIP
-------------------- -------------------- -------------------- -------------------- -------
mj redarmy 陈红军
SQL> update users set password='123' where username='mj';
update users set password='123' where username='mj'
ORA-01456: 不能在 READ ONLY 事务处理中执行插入/删除/更新操作
//脏读的案例
SQL> set transaction isolation level read committed;
Transaction set
SQL> select * from users where username='mj';
USERNAME PASSWORD NAME ADDRESS ZIP
-------------------- -------------------- -------------------- -------------------- -------
mj redarmy 陈红军
SQL> update users set password='123' where username='mj';
1 row updated
SQL> select * from users where username='mj';
USERNAME PASSWORD NAME ADDRESS ZIP
-------------------- -------------------- -------------------- -------------------- -------
mj 123 陈红军
SQL> rollback;