【ORACLE数据库事务管理】

一、事务:由一个或多个DMLSQL语句组成,事务从第一条可执行的SQL开始,在提交或回滚时终止,并且要么完全成功执行,要么一点也不执行。作用:保证数据库的完整性。

注:ORACLE事务是自动开启事务的;而mysql需要手动开启事务:start transation;
注:mysql的生命周期:
在这里插入图片描述

1.事务的四大特性:ACID

1)原子性(Atomicity)
事务中包含的所有操作要么全做,要么都不做,也就是说所有的活动在数据库中要么全部反映,要么全部不反映,以保证数据库的一致性。
2)一致性(Consistency)
数据库在事务操作前和事务处理后,数据必须满足业务的规则约束。
3)隔离性(Isolation)
数据库允许多个并发的事务同时对其中的数据进行读写或修改的能力(多个事务之间互不干扰),隔离性可以防止多个事务的并发执行时,由于它们的操作命令交叉执行而导致数据的不一致性。
4)持久性(Durability)
事务处理结束后,它对数据的修改应该是永久的。即便是系统在遇到故障的情况下也不会丢失,这是数据的重要性决定的。

2.事务处理过程:以sqlplus请求连接ORACLE服务器,进行SQL操作为例

1).用户使用用户进程
2).ORACLE在检查用户请求的全法性后(操作系统认证,或密码认证),为该用户启动一个专用的服务器进程。
3).用户执行一条把新行插入表中的语句
4).ORACLE检查用户权限以确认是否有执行插入操作的必需权限如果用户权限信息不在数据字典缓冲中,必须磁盘上system表空间所对应的数据文件中读取相应权限到数据字典缓冲中。
5).如用户有必需的权限,ORACLE检查用户要执行的SQL语句是否以前执行过且是否在库高速缓冲区(查看执行计划)。 若是,ORACLE执行此SQL,否则,ORACLE硬分析该SQL语句。后保存到库高速缓存区,最后执行该SQL
6).ORACLE首先检查必需的数据是否已经在数据库高速缓冲区当中如不在,则由服务器进程查询数据字典以找到所对应的数据文件,从中读取相应数据放入数据库高速缓冲区中。
7).ORACLE在必要的地方施加行级锁防止其他进程同时修改相同的数据只有当前用户读的是真实数据,其他读的是假数据 (这个表没有修改的行是从表中读,修改的那一行是在UNDO中读,因为加了锁:构造CR块);当提交之后,锁释放,其他人也会读到真实数据。
8).服务器将还未被修改的数据写入重做日志缓冲区。
9).服务器在数据库高速缓冲区中修改表的数据(插入新行)
10).用户提交事务,即将插入的数据永久化。ORACLE在提交完成后会释放行级锁。
11).LGWR立即将重做日志缓冲区中的更改数据写入联机重做日志文件。
12).服务器进程通过用户commit complete
13).插入操作对表的更改不会立即写入磁盘,DBWR进程会批量进行写入更改当写入后,要插入的信息才永久地写入磁盘数据文件。

3.结束事务:commit 或 rollback

提交事务(commit):ORACLE把该事务所在的操作永久化的保存到数据库中
回滚事务(rollback):撤销自事务开始以来的所有修改。只有提交事务后,其他会话上的用户才能看到该事务所做的更改。当一个事务未能完全执行(如系统断电),整个事务都将被撤销。ORACLE将回滚事务中的SQL所做的所有更改。使数据回到该事务开始前的状态。以维护数据的一致性。

注:redo与undo
redo:恢复修改之后的数据
undo:回退到之前的数据

4.数据异常情况:脏读、不可重复读、幻读

脏读:一个事务读取另一个事务未提交的数据
当一个事务修改数据时,另一事务读取了该数据,但是第一事务由于某种原因取消对数据修改,使数据返回了原状态,这是第二个事务读取的数据与数据库中数据不一致
解决机制:提交读Read committed

不可重复读取:是指一个事务读取数据库中的数据后,另一个事务则更新了数据,当第一个事务再次读取其中的数据时,就会发现数据已经发生了改变
不可重复读取所导致的结果就是一个事务前后两次读取的数据不相同。
解决机制:可重复读Repeatable read

幻读:如果一个事务基于某个条件读取数据后,另一个事务则更新了同一个表中的数据,这时第一个事务再次读取数据时,根据搜索的条件返回了不同的行。
解决机制:串行化Serializable

【不可重复度和幻读区别】:不可重复读的重点是修改,幻读的重点在于新增或者删除。

脏读、不可重复读、幻读的级别高低是:脏读 < 不可重复读 < 幻读。所以,设置了最高级别的SERIALIZABLE_READ就不用在设置REPEATABLE_READ和READ_COMMITTED了

5.隔离级别:Read uncommitted (未提交读)、 Read committed( 提交读 ) 、 Repeatable read (可重复读)、 Serializable( 串行序列化 )。这四个级别可以逐个解决脏读、不可重复读、幻读这几 类问题。但ORACLE仅支持两种:提交读和串行化;除此之外oralce中还定义read only 和 read write隔离层

6.创建事务语句

Set transaction read only  #设置为只读
Set transaction read write #设置为可读可写
Set transaction isolation level read committed #设置隔离级别为提交读
Set transaction isolation level serializable #设置隔离级别为串行化

注意:这些语句是互斥的.即不能够同时设置两个或者两个以上的选项
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

骑着蜗牛追汤圆

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值