数据库事务的本质

本文深入解析了数据库事务的四种隔离级别:READ UNCOMMITTED、READ COMMITTED、REPEATABLE READ 和 SERIALIZABLE 的工作原理及应用场景。通过具体的SQL示例说明了每种隔离级别下事务如何读取数据和避免并发问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

事务的本质

redo log - 重做日志,保存sql语句到一个指定的log文件,先到logbuffer,然后commit或一定条件满足后刷到磁盘/undo log - 回滚日志,将当前要修改的行内容复制到undobuffer,满足一定条件后刷到磁盘,保存在数据文件中

修改一行数据:

先用排他锁锁定该行,记录redolog,把改行修改前的值copy到undolog中,然后修改当前行的值,填写事物编号,并使回滚指针指向undolog中修改前的行

事物隔离级别

感觉这个例子比较通俗https://blog.youkuaiyun.com/qq_33290787/article/details/51924963, 基于事物的本质参考:https://blog.youkuaiyun.com/chen77716/article/details/6742128,可以增加如下理解

名称 解释-t1解释-t2
READ UNCOMMITTED

读取未提交内容,脏读

读事物直接读取主记录,无论事物是否完成

begin transaction

update

 

rollback

select data
READ COMMITTED

读取提交内容

读事物读取最新的undolog,确保可以去到最新的更新,但重复可能会读到不同的值

begin transaction

update

commit

 

 

begin transaction

update

commit

 

 

 

 

select data

 

 

 

select data

REPEATABLE READ

可重读

读事物读取指定版本号的undolog,确保可以多次重复读取相同的值,但可能读不到最新增加的值,因为insert不会记录undolog

begin transaction

insert value into range

commit

 

 

begin transaction

insert value into range

commit

 

 

 

 

select data where range

 

 

 

 

select data where range

SERIALIZABLE

可串行化,为每个读数据建立共享锁

锁表

 完全串行,未提交再操作等待

 

查看oracle数据库隔离级别

首先需要先在事物中,然后用如下sql查看事物隔离级别

复制代码
select sid,serial#,flag,
  CASE WHEN bitand(FLAG,268435456) = 0 THEN 'SERIALIZABLE'
                                       ELSE 'READ COMMITTED'
                                       END AS ISOLATIONLEVEL
  from V$transaction t,v$session s
  where t.addr=s.taddr
  AND   audsid = USERENV('SESSIONID');
复制代码
       SID    SERIAL#   FLAG ISOLATIONLEVEL
---------- ------------- -------- --------------
    52        3            3587 SERIALIZABLE

设置oracle数据库隔离级别

 SET TRANSACTION ISOLATION LEVEL***

 

转载于:https://www.cnblogs.com/it-worker365/p/8759193.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值