ORACLE Isolation Level

ORACLE Isolation Level

 

4个级别,3种读取情况

 

 

Isolation LevelDirty ReadNonrepeatable ReadPhantom Read
Read uncommittedPossiblePossiblePossible
Read committedNot possiblePossiblePossible
Repeatable readNot possibleNot possiblePossible
SerializableNot possibleNot possibleNot possible

 

Dirty reads[脏读]:

A transaction reads data that has been written by another transaction that has not been committed yet.

读人家还没有提交的数据。人家有可能是瞎插几条数据,马上就会回滚的,但是这种“脏读”会把这些数据搜出来,让我们看见根本不会进数据库的数据,所以叫“脏读”。数据库不要设置这种隔离级别。

 

Nonrepeatable (fuzzy) reads[不可重复读,模糊读]:

A transaction rereads data it has previously read and finds that another committed transaction has modified or deleted the data. For example, a user queries a row and then later queries the same row, only to discover that the data has changed.

同一条SQL,不同时间读出不一样的数据。

就是说,在这个隔离级别上,一条SQL查出数据后,就不管那些数据了,别人可以对这些数据修改。

所以读出来的数据是模糊的,今天这些,明天就不知道了。

通常数据库的隔离级别都是这个级别【read committed】。

 

Phantom reads[幻读]:

A transaction reruns a query returning a set of rows that satisfies a search condition and finds that another committed transaction has inserted additional rows that satisfy the condition.

For example, a transaction queries the number of employees. Five minutes later it performs the same query, but now the number has increased by one because another user inserted a record for a new hire. More data satisfies the query criteria than before, but unlike in a fuzzy read the previously read data is unchanged.

幻读是非常正常的事情,你提交的东西我当然要读啦,注意是新提交的。

 

 

 

再说说级别:

1. Serializable

这就是锁,数据库全锁死,一个人或者一个线程操作数据库,上面的情况都不会发生。数据库是不会设置这个级别的。

 

2. Repeatable read

设置这个级别就是可以重复读的,每条SQL执行后,被这条SQL搜出的数据会锁上,不让改,不让删,所以每次读出来肯定是一样的数据,但是幻读还是会的,符合条件的新数据插进来了,也会被查出来。

这种级别也会把数据库的性能降得很低,数据查上来看看就行了,怎么可以阻止人家去修改这些数据呢?

 

3.Read committed

通常都是用这个的,脏读不发生,其他发生好了。

 

下面是三种常用数据库查看和设置的一些信息:

 

 

mysql查看与设置事务隔离级别

-------------------------

1.查看当前会话隔离级别

select @@tx_isolation;

 

2.查看系统当前隔离级别

select @@global.tx_isolation;

 

3.设置当前会话隔离级别

set session transaction isolatin level repeatable read;

 

4.设置系统当前隔离级别

set global transaction isolation level repeatable read;

 

5.命令行,开始事务时

set autocommit=off 或者 start transaction

 

 

sqlserver查看事务隔离级别[没有测试]

---------------------------------

SELECT CASE transaction_isolation_level 

WHEN 0 THEN 'Unspecified' 

WHEN 1 THEN 'ReadUncomitted' 

WHEN 2 THEN 'Readcomitted' 

WHEN 3 THEN 'Repeatable' 

WHEN 4 THEN 'Serializable' 

WHEN 5 THEN 'Snapshot' END AS TRANSACTION_ISOLATION_LEVEL 

FROM sys.dm_exec_sessions 

where session_id = @@SPID

 

 

oracle11g查看与设置事务隔离级别

------------------------------

查看:

网上也有人问这问题,但是都没有回答,去了权威的论坛

发现有人被骂了,说ORACLE的隔离级别不可以单独拿出来说

不要去知道oracle的隔离级别,要了解其机制,乱七八糟一大堆

我估计oracle的每个session,都有自己的隔离级别,如果你非要看,

如果用toad客户端可以按照以下步骤:

 

0.

保证自动提交是关闭的.

 

1.拿到自己的 sid serial#, like后面的参数是自己的电脑名字,用的是toad客户端 

SELECT   t.sid, t.serial#, t.*   FROM   v$session t WHERE   t.terminal  LIKE '%HUBIN-XP%'

 

2.

--try

delete from schema.table where obj_id='10001';

--then 

select * from v$transaction ;

--you can see a  row in this view

 

3.跑这SQL,参数是1拿到的,可以看见你要的级别了

SELECT s.sid, s.serial#,

  CASE BITAND(t.flag, POWER(2, 28))

    WHEN 0 THEN 'READ COMMITTED'

    ELSE 'SERIALIZABLE'

  END AS isolation_level

FROM v$transaction t, v$session s

WHERE t.addr = s.taddr

  AND s.sid = :sid

  AND s.serial# = :serial;

 

设置:

你确定你真理解真的要设置oracle的级别?

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值