数据库引入事务的主要目的是:事务会把数据库从一种一致状态转变为另一种一致状态。在数据库中提交工作时,可以确保要么所有修改都已经保存,要么所有修改都不保存。另外,还能保证实现了保护数据完整性的各种规则和检查。
这对于我们的一些应用是至关重要的,比如一个转账业务,从A账户转出1000元到B账户,操作1:从A账户减少1000元,操作2:B账户增加1000元。假如不能保证这两个操作要么都成功,要么都失败,就会有问题的。比如操作1成功了,操作2失败了。那么客户应该把你告上法庭了。
事务都有四个特征:
原子性(atomicity):事务中的所有动作要么都发生,要么都不发生。
一致性(consistency):事务将数据库从一种一致状态转变为下一种一致状态。
隔离性(isolation):一个事务的影响在该事务提交前对其他事务都不可见。
持久性(durability):事务一旦提交,其结果就是永久性的。
oracle通过读一致性版本保证了一致性与隔离性。下面我们看看oracle如何实现原子性。
1. 语句级别原子性
假设一条插入语句I1影响了T1表,同时触发了触发器,触发器影响了T2表。那么假设这条插入语句失败,对T1与T2的影响都会回滚。但是在Sql Server里面,触发器会独立于触发语句执行。如果触发器遇到一个错误,它必须显式 地回滚自己的工作,然后产生另外一个错误来回滚触发语句。否则,即使触发语句(或该语句的另外某个部分)最终会失败,触发器完成的工作也会持久保留。
2. 过程级别原子性
假设一个存储过程执行2哥插入操作I1与I2,都影响T1表,同时插入操作会触发触发器,触发器影响T2表。那么假设I1执行成功,I2执行失败。那么对T1与T2表的影响都会回滚。
3. 事务级别原子性
最后,还有一种事务级原子性的概念。事务(也就是一组SQL语句作为一个工作单元一同执行)的总目标是把数据库从一种一致状态转变为另一种一致状态。
为了实现这个目标,事务也是原子性的,事务完成的所有工作要么完全提交并成为永久性的,要么会回滚并撤销。像语句一样,事务是一个原子性的工作单元。提交一个事务后,接收到数据库返回的“成功”信息后,你就能知道事务完成的所有工作都已经成为永久性的。
最后说2种不好的事务习惯。
1. 再循环中提交事务
如果交给你一个任务,要求更新多行,大多数程序员都会力图找出一种过程性方法,通过循环来完成这个任务,这样就能提交多行。据我听到的,这样做的两个主要原因是:
A. 频繁地提交大量小事务比处理和提交一个大事务更快,也更高效。
B. 没有足够的undo空间。
这 两个结论都存在误导性。另外,如果提交得太过频繁,很容易让你陷入危险,倘若更新做到一半的时候失败了,这会使你的数据库处于一种“未知”的状态。要编写 一个过程从而在出现失败的情况下能平滑地重启动,这需要复杂的逻辑。到目前为止,最好的方法是按业务过程的要求以适当的频度提交,并且相应地设置undo段大小。
如果在循环中提交事务,可能会遇到让人胆战心惊的ORA-01555错误(snapshot too old)。这是因为如果是一个大批次的更新操作,这些操作会先读取要更新的数据进行“拍照”。其实这些照片是存放在undo段的,每更新一行都会去undo段取对应的“照片”,但是如果一边更新与提交,这些更新信息也会写入undo段。假设undo段不大的话,以前的“照片”可能就会被这些更新信息覆盖掉。这样如果找不到照片就会报这个错误了。
并且最严重的是,报这个错误的时候,你甚至没有办法进行恢复。因为报ORA-01555错误的例子会使更新处于一种完全未知的状态。有些工作已经做了,而有些还没有做。已经做的工作提交了,无法进行回滚。那么我们只能把那些没做的工作拿出来继续完成,遗憾的是我们无法区分那些工作是没做的。
2. 自动提交事务
在我们用jdbc获取一个连接执行sql语句的时候,没执行一条sql语句默认提交一遍事务。其实这是错误的做法。我们需要在获取到jdbc连击之后conn.setAutoCommit (false);将自动提交关闭。
分享到:
相关推荐
数据缓冲区存储从数据文件读取的数据,日志缓冲区用于记录事务日志,而共享池则用于SQL和PL/SQL的解析、编译和执行,包括库缓存、数据字典缓存和用户全局区。 2. 初始参数调整 通过初始化参数如DB_BLOCK_SIZE可以...
Oracle数据库作为一款成熟的商用关系型数据库管理系统,在实际使用过程中可能会遇到各种各样的错误。这些错误会影响数据库的正常运行和数据的稳定性。Oracle公司的工程师们列举了一些常见的Oracle错误,并提供了相应...
标题中的“浅谈ORACLE与SQL SERVER的差异”暗示了我们将探讨两个主要的数据库管理系统——Oracle和Microsoft SQL Server之间的区别。这两个系统都是广泛使用的数据库解决方案,各有其特点和优势。 在性能方面,...
例如,当一个数据块被多个事务并发访问时,Cache Fusion能够智能地决定哪些事务可以本地处理,哪些需要全局协调,从而优化性能。 Oracle RAC的发展历程从8i的OPS到9i的RAC,再到10g和11gR2,其主要进步体现在自动化...
浅谈数据库中事务处理和并发控制技术 数据库事务处理和并发控制是数据库管理系统(DBMS)中的核心技术, Guarantees 数据库的可靠性和一致性。本文将详细介绍数据库事务处理和并发控制技术的概念、特性和实现机制。...
2. 日志管理:Oracle数据库的重做日志(Redo Log)记录了所有的事务更改,是实现事务恢复和崩溃恢复的关键。归档日志(Archived Logs)则保存了已提交的事务,以备在需要时进行恢复。因此,保持日志的完整性和管理好...
例如,Cache区的设置直接影响数据读取的速度,I/O设置关系到数据的存储和检索效率,参数设置决定了数据库的行为模式,CPU调整可以优化计算资源的分配,而回滚段设置和碎片整理则关乎事务处理和空间利用率。...
事务隔离级别决定了事务在并发环境中的可见性,Oracle支持四种隔离级别:读未提交(READ UNCOMMITTED)、读已提交(READ COMMITTED)、可重复读(REPEATABLE READ)和串行化(SERIALIZABLE)。选择合适的隔离级别...
Lock在Oracle中主要用于解决业务层面的数据竞争,防止多个事务同时修改同一数据,以确保数据的一致性。Oracle提供了多种类型的锁,如行级锁(Row Locks)、表级锁(Table Locks)、共享锁(Shared Locks)和独占锁...
在Oracle数据库应用系统中,吞吐量主要指的是在一定时间内系统能够处理的事务数量,通常以每秒事务数(tps)来衡量。提高吞吐量的一个有效方法是缩短服务时间,提升服务效率,以便在相同资源条件下处理更多业务。另...
ADO提供了丰富的对象模型,如Connection、Command、Recordset等,可以方便地执行SQL语句、处理事务、进行数据绑定等操作。 4. **Oracle的OLE对象** 除了微软的接口,Oracle自身也提供了OLE DB供应商,使得VB可以...
其次,LogMiner可以确定事务级别的逻辑恢复操作。管理员可以获取用户的更新操作和相应的回滚操作(UNDO操作),从而可以撤销这些错误的更新操作。这对于纠正用户操作错误提供了便捷的手段。 除此之外,LogMiner还...
Oracle 11g 的闪回技术是数据库管理系统中一种强大的数据恢复工具,旨在快速纠正由于逻辑错误或意外操作导致的数据损坏。闪回技术的核心在于它允许数据库管理员将数据库的状态回滚到过去的一个特定时间点,从而恢复...
这是事务处理和并发控制的一部分,确保了数据的完整性。 最后,即使语法和语义检查都通过,服务器还会验证客户端用户是否拥有访问数据的权限。没有相应权限的用户将无法获取数据。权限检查是数据库安全的重要组成...
Oracle数据库是当前市场上占有率极高的数据库系统,以高效处理事务著称,但随着数据量的增加,其性能问题也越发显著。影响Oracle数据库性能的因素众多,包括数据库服务器、硬件、内存和参数设置等。尽管这些问题很...
在教学中,Oracle数据库的知识点包括SQL查询语言、数据库设计(如ER模型)、表空间管理、索引创建、存储过程与函数、触发器、游标、事务控制、备份与恢复策略等。 【关系型数据库】关系型数据库是基于关系理论的...
Oracle数据库系统性能优化是数据库管理中的重要环节,它涉及到数据库设计、硬件配置、操作系统设置、数据库参数调整以及应用程序优化等多个方面。在设计阶段进行性能优化是最经济且效果最佳的策略,因为一旦系统上线...
主要介绍了浅谈oracle SCN机制,介绍了oracle事务中数据变化的部分内容,以及scn的作用等,需要的朋友可以参考下。