oracle中的事务

事务的定义

事务是个独立的逻辑工作单元,它由特定的一系列必须作为一个整体一起成功或失败的SQL语句组成。
每个事务都有一个很清楚的起点,就是第一个可执行的SQL语句的开始执行时;
一个确定的结束点,就是当事务的工作进行了提交或回滚之后。
已经开始但未提交或回滚的事务是活动事务,活动事务中的所有修改在提交之前都是不确定的。
如果事务失败了或进行了回滚,则这些不确定的修改将不会在数据库中存在。


事务中的sql语句不允许单独执行处理,否则数据完整性就会出现问题。
事务不应该包含任何额的工作。加入不相关的工作违反了事务的定义:原子性。
一个事务可以有多个DML语句组成,但只能含有一个数据定义DDL语句。
这是因为每个DDL语句都会产生一次隐式提交,同时也会提交任何之前没有提交的工作。
因为事务必须完成一个完整的逻辑工作单元,所以需要确定DDL语句要么在DML语句之前作为一个单独的事务被提交,
或者是在所有DML语句都被成功处理之后。
如果DDL语句放在事务的中间来执行,则“完整的逻辑单元”就会被划分为两个不是那么符合逻辑的部分更新。

事务的属性(ACID)

A:原子性atomicity:事务中的所有任务是一个不可分割的整体,都必须全都执行或者全都不执行,不存在部分事务
C:一致性consistency:事务将数据库从一个一致性状态带到另一个一致性状态
I:隔离性isolation:一个事务所带来的的影响,知道改事务提交之前对其它事务来说是透明的,不可见的
D:持久性durability:经过提交的事务对数据库的影响是永久性的
oracle自动为sql语句提供acid属性,程序员不需要做任何额外工作。

事务的隔离级别

SQL标准定义了4个不用的事务隔离级别:
未提交读
提交读
可重复读
序列化

隔离级别所产生的问题

标准定义了某个特定的隔离级别允许或不允许的3中现象:
**脏读:**读取一个未提交的事务成为脏读

**不可重复读:当事务第二次执行同一个查询时,有一另一个事务提交了“更新”**而得到不同结果时就发生了不可重复度。
这种情况下由另一个事务进行的更新已经经过了验证并被持久化,因此数据是正确的的,只是在你的事务上一次读取之后进行了修改。

**幻读:如果事务中的一个查询第二次执行,但返回了满足条件的过滤标准的记录,就认为时发生了幻读。当其他事务“插入”**了更多的数据并进行了提交就可能产生幻读。

默认的,oracle中的事务在其他用户提交工作之后马上就允许读取。这意味着除非将自己的事务隔离级别特定设置为只读或序列化,否则就有可能发生不可重复读或幻读。

**oracle不支持未提交读隔离级别,也不能改变数据库来让他支持。在oracle中不必担心脏读问题。**但是在Mysql中存在该问题。

如果事务是在默认的提交读模式下运行,则“数据的一致性视图”意味着结果是基于一个查询或者更新发起时已经提交的数据。
如果事务在序列化模式下运行,则一致性视图是基于事务开始时已经提交的数据的。

设计事务的一般规则

1)将每个逻辑工作单元作为独立的事务处理,不要包含额外工作。

2)确保在事务开始的时候数据是一致的,并且到事务完成的时候数据仍然保持一致。

3)获取所需要的资源来处理事务,然后释放资源给其他事务使用。只占有所需的共享资源,但不要更长。

4)也不要在实务中加入提交来释放仍然需要的锁。加入提交打断逻辑单元并且对数据库没有好处。

5)考虑可能同时进行的其他事务的处理

6)使用保存点来标记适合事务中间进行回滚的特定sql语句

7)事务必须进行显示提交或回滚

8)设计了一个可靠的事务后,考虑将它封装到存储过程或包中。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值