首页 > 数据库 >oracle里的事务

oracle里的事务

时间:2024-09-02 12:23:23浏览次数:11  
标签:事务 ROLLBACK 并发 回滚 Oracle 提交 oracle

事务是一组不可分割的数据库操作,这些操作要么全部成功(提交),要么全部失败(回滚)。事务管理是数据库管理系统(DBMS)中的一个关键特性,它确保了数据库在并发操作下的稳定性和一致性。

1. 事务的基本属性 (ACID)

事务具有四个基本属性,统称为 ACID 属性:

  • Atomicity(原子性):事务中的所有操作要么全部执行成功,要么全部不执行。即便事务中的某个操作失败,整个事务也会回滚到事务开始前的状态。

  • Consistency(一致性):事务在开始和结束时,数据库的状态必须是一致的。即,事务的执行不能破坏数据库的约束和规则。

  • Isolation(隔离性):多个事务并发执行时,一个事务的执行结果不应影响其他事务的执行。Oracle 通过不同的隔离级别来控制并发事务之间的相互影响。

  • Durability(持久性):一旦事务提交(COMMIT),其结果就会永久保存到数据库中,哪怕系统崩溃也不会丢失。

2. 事务的基本操作

Oracle 中事务的基本操作包括:

  • BEGIN TRANSACTION(隐式启动事务):在 Oracle 中,事务通常隐式地启动。每当你执行一条 INSERTUPDATEDELETESELECT FOR UPDATE 语句时,事务就自动开始了。

  • COMMIT(提交):提交事务,将事务中的所有更改永久保存到数据库中。

    COMMIT;
  • ROLLBACK(回滚):回滚事务,撤销事务中的所有未提交的更改,使数据库恢复到事务开始前的状态。

    ROLLBACK;
  • SAVEPOINT(保存点):在事务中创建一个保存点,允许你回滚到事务中的某个特定点,而不是回滚整个事务。

    SAVEPOINT savepoint_name;
  • ROLLBACK TO SAVEPOINT(回滚到保存点):将事务回滚到之前定义的保存点。

    ROLLBACK TO savepoint_name;

3. 事务控制示例

假设你有一个名为 employees 的表,现在你要更新员工的薪水,并根据不同情况决定是否提交或回滚事务:

-- 开始事务(隐式)
UPDATE employees SET salary = salary * 1.1 WHERE department_id = 10;

SAVEPOINT before_bonus;

-- 给销售部门的员工增加奖金
UPDATE employees SET salary = salary + 1000 WHERE department_id = 20;

-- 检查某些条件,如果不满足,回滚奖金更新
ROLLBACK TO before_bonus;

-- 最后提交所有更改
COMMIT;

在这个例子中:

  1. 更新了部门ID为10的员工的薪水,隐式启动了一个事务。
  2. 创建了一个保存点 before_bonus
  3. 更新了部门ID为20的员工的薪水,增加了奖金。
  4. 如果某些条件不满足,可以回滚到保存点 before_bonus,撤销奖金更新,但保留之前的薪水更新。
  5. 最终,提交整个事务,将更改永久保存。

4. 事务隔离级别

Oracle 支持四种事务隔离级别,用于控制事务之间的相互影响:

  • READ UNCOMMITTED:允许一个事务读取其他事务尚未提交的更改。可能导致脏读(Dirty Read)问题。Oracle 默认不支持这个隔离级别。

  • READ COMMITTED(默认隔离级别):只允许事务读取其他已提交的更改。可以防止脏读,但可能会出现不可重复读(Non-repeatable Read)问题。

  • REPEATABLE READ:保证在事务内多次读取相同数据时,数据是一致的(即其他事务不能修改或删除该数据)。可以防止脏读和不可重复读,但不能防止幻读(Phantom Read)。Oracle 使用快照隔离来提供类似的效果。

  • SERIALIZABLE:提供最高的隔离级别,强制事务串行执行,防止脏读、不可重复读和幻读,但代价是降低了并发性。

5. 自动提交与显式事务控制

在一些情况下(如使用 SQL*Plus 或其他工具),SQL 语句可能会自动提交。要完全控制事务,建议显式使用 COMMITROLLBACK

6. 事务的并发控制

Oracle 使用多版本并发控制(MVCC,Multi-Version Concurrency Control)来管理事务并发性。每个事务会看到一个一致性的快照,这意味着事务在执行期间,看到的数据与其他事务不会相互影响。这种机制可以有效地减少锁争用并提高并发性能。

标签:事务,ROLLBACK,并发,回滚,Oracle,提交,oracle
From: https://blog.csdn.net/weixin_72431427/article/details/141760296

相关文章

  • Java数据库事务管理:ACID属性的实现与应用
    Java数据库事务管理:ACID属性的实现与应用大家好,我是微赚淘客返利系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!在现代软件开发中,数据库事务管理是确保数据一致性和完整性的关键。ACID属性是事务处理的基石,包括原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)和持久......
  • Kafka事务实现原理
    1Kafka的事务V.SRocketMQRocketMQ事务主要解决问题:确保执行本地事务和发消息这俩操作都成功/失败。RocketMQ还有事务反查机制兜底,更提高事务执行的成功率和数据一致性。而Kafka事务,是为确保在一个事务中发送的多条消息,要么都成功,要么都失败。这里的多条消息不一定在同一个top......
  • Kafka事务实现原理
    1Kafka的事务V.SRocketMQRocketMQ事务主要解决问题:确保执行本地事务和发消息这俩操作都成功/失败。RocketMQ还有事务反查机制兜底,更提高事务执行的成功率和数据一致性。而Kafka事务,是为确保在一个事务中发送的多条消息,要么都成功,要么都失败。这里的多条消息不一定在同一个to......
  • “事事通”校园事务通知小程序的设计与实现-计算机毕业设计源码23598
    摘要 校园事务是大学生日常生活中不可或缺的一部分,包括课程查询、教务管理、校园活动信息等。然而,目前大多数学校在校园事务的通知发布和信息查询方面还依赖传统的官方网站和邮件通知,这种方式存在信息不及时、查找不方便等问题。本文旨在通过引入SpringBoot和Vue框架,结合云......
  • 可重复读隔离级别真的完全解决不可重复读问题了吗?读已提交隔离级别能避免不可重复读问
    一文带你搞懂MySQL事务的各个疑惑,不要再在脑子里一团浆糊啦!!事务的四大特性MySQL的三种日志事务的原子性是如何保证的?事务的隔离性是如何保证的?事务的持久性是如何保证的?数据库事务的隔离级别各隔离级别都各自解决了什么并发问题?什么是MVCC?读已提交和可重复读隔离级别实......
  • FireDAC链接Oracle 出现ora-1309 错误的完整解决
    环境:笔记本上安装的64位Windows7,64位Oracle11.2,C++Builder1132位。目标:使用FireDAC连接Oracle。过程:1.检查oracle客户端连接。使用sqlplus连接,没有任何问题。使用PLSQLDeveloper64位连接,没有任何问题。2.创建32位VCLWindowsForm.放置一个FDCConnection。设置Par......
  • MYSQL-事务篇
    事务是一组操作的集合,他是不可分割的工作单位,事务会把所有的操作作为一个整体一起向系统提交或撤销操作请求,即这些操作要么同时成功要么同时失败。默认mysql的事务是自动提交的,也就是说,当执行一条DML语句,mysql会立即隐式的提交事务。事务的四大特性原子性:事务是不可分割的最......
  • 【MySQL 12】事务管理 (带思维导图)
    文章目录......
  • RocketMQ 与 Spring Cloud Stream之事务消息配置
    1引言RocketMQ的事务消息设计是为了解决分布式系统中数据一致性的问题。在分布式系统中,由于数据可能分布在不同的服务或节点上,因此需要一种机制来确保数据的最终一致性。事务消息通过引入本地事务和消息状态的关联,确保了消息的发送与本地事务的执行结果紧密相关,从而避免了......
  • 用PowerDesigner创建Oracle模型转为mysql模型
    一.首先打开PowerDesigner1.File(位置:左上角)–>NewModel–>PhysicalDateModel(物理数据模型)(1)DBMS选择MySQL5.0(版本可能不对,但毕竟是mysql语句的)(2)之后点确定就行(3).可能会出现一个问题就是DBMS的下拉框什么也没有退出也不好用(其实挺简单的)1.点击DBMS最右边......