第二篇 一次事务过程
对于开发人员来说,我们经常做的是启动一个事务,执行SQL,提交事务。这就完成了我们的工作。但是,就在这些简单的动作背后,网络和数据库都做了些什么呢。我们都想知道。
下面以一个实例来说明。
背景:用户正运行一个连接到Oracle数据库的客户端应用程序,是一个员工档案管理程序。
过程:
1.用户修改了一笔员工档案记录的姓名,并单击了“保存”,这时客户端应用程序通过网络向Oracle服务器进程发送了一条SQL UPDATE语句;
(注:关于客户与服务器的如何连接的过程,将另起篇幅说明。将会涉及到:Oracle Net组件、MTS、监听器、Dispatcher等概念)
2.服务器进程收到UPDATE语句请求以后,在SGA的SQL区中查找同样的语句,如果找到了则执行。否则,服务器进程就检查语句的语法,并对它进行分析,从而以最优的方法执行(这个过程叫做parsing and optimizing)。一旦这个处理完成了以后,这条语句就缓存在SGA的SQL共享区中;
3.服务器进程将原来的员工的、数据拷贝到回滚段(或重做表空间,即undo tablespace,oracle后来的版本增加了Undo tablespace功能,以取待原有的system表空间中的回滚段的功能)。将原来的员工数据拷贝到回滚段中是为了将来用户取消事务而备用的。在这个过程完成之后,服务器进程修改数据库的数据块以改变员工的姓名。修改后的数据库的数据块此时保存在SGA的数据库缓冲区中。
4.服务器进程在SGA日志缓冲区内记录加滚段和数据库块的改变信息。(注意:回滚段的改变也同样要写入日志,因为它也是事务的一部分);
5.客户端的用户提交事务;
6.LGWR(log writer)进程将这个事务的日志信息从日志缓冲区中写入当前的磁盘日志文件中。当操作系统确定写日志文件已经正确完成时,事务才算是提交了。
7.服务器进程向客户发送信息以确认提交。
在这整个过程中有个疑问:只是将事务的日志写入日志文件,但数据库块,也就是员工姓名改变后的数据并未写入磁盘文件,这是为什么呢?进而我又会想到,如果有多个事务同时作用于相同的数据呢。这时,Oracle是怎么处理这些问题的呢?带着这些问题,继续学习,弄懂后再贴出来。:)
分享到:
相关推荐
例如,在给定的部分内容中,演示了一个名为`TransProc`的存储过程,它接收两个参数并执行两次插入操作。这些插入操作被封装在一个事务`InProc`中。如果事务中的所有操作都成功,可以使用`COMMIT`语句提交事务;如果...
存储过程是一组预编译的SQL语句,可以在数据库中被多次调用,提高了效率并降低了网络流量。本篇将详细介绍如何在SQL Server存储过程中使用事务。 首先,事务有四个基本特性,即ACID(原子性、一致性、隔离性和持久...
MySQL是目前最流行的开源关系型数据库管理系统之一,它提供了丰富的数据库高级特性,比如存储过程、触发器和事务管理。这些特性增强了数据库的交互性、安全性和性能。 一、存储过程 存储过程是一组为了完成特定...
一次长事务可能会占用大量资源,导致其他并发事务出现锁等待,甚至超时,严重影响数据库的性能和正常服务。本篇文章将深入探讨这个问题,从原因、表现、诊断到解决策略进行详细分析。 一、长事务的定义与特征 长...
存储过程可以提高性能,因为它们只需编译一次,然后在后续调用中重用。此外,它们可以封装复杂的逻辑,减少网络流量,提高安全性,并提供更好的模块化结构。 4. **视图**:视图是数据库中的虚拟表,它是由一个或多...
- 示例:事务A第一次读取某数据集合后,事务B在事务A的第二次读取前插入了一些新的数据,导致事务A第二次读取时发现多了新的数据。 #### 四、事务隔离级别 为了解决上述事务并发问题,数据库提供了不同的事务隔离...
它保证了用户的每一次操作都是可靠的,即便出现了异常的访问情况,也不至于破坏后台数据的完整性。 TransactionDefinition 接口 在 Spring 中,事务是通过 TransactionDefinition 接口来定义的。该接口包含与事务...
了解了基本概念后,我们来看看Spring事务切面的调用过程。事务处理的核心类是`TransactionInterceptor`,它实现了`MethodInterceptor`接口,用于拦截事务方法的执行。`invoke`方法是关键入口点,它首先确定目标类,...
该功能意味着相关SQL语句不会立即执行,而是在事务成功提交之后才会执行,并且保证这些语句只执行一次。后置执行对应于补偿型事务中的Confirm阶段。 在业务逻辑中,有些操作是可以从主事务流程中剥离出来的,通过...
自治事务(Autonomous Transaction)是一种特殊的事务类型,它可以在主事务的执行过程中独立启动和提交,不受主事务的提交或回滚的影响。自治事务主要用于日志记录、审计、通知等功能,确保即使主事务失败,关键的...
- Redis 的事务则不同,命令被放入队列中,只有在 `EXEC` 时才一次性执行,如果有语法错误,整个事务会被废弃。 5. **错误处理**: - MySQL 事务中的错误不影响其他已执行的正确语句,需要程序员通过判断和回滚来...
4. **减少网络流量**:相比于多次发送单独的SQL语句,一次发送一个存储过程调用能减少网络传输的数据量。 5. **简化复杂操作**:存储过程可以包含复杂的逻辑,如条件判断、循环等,使得数据库端的处理更为方便。 ...
- **降低事务日志开销**:每次提交都会在事务日志中记录一次,因此批量提交可以减少事务日志的写入量。 - **提高并发处理能力**:由于减少了锁定的时间,所以可以更好地支持高并发环境下的数据处理任务。 #### 三、...
- 使用`BulkInsert`或类似扩展方法,一次性将大量数据写入数据库,大大提高插入效率。 通过`DapperTest.sln`项目文件,我们可以进一步了解如何在实际项目中应用这些功能。`packages`文件夹可能包含了Dapper和其他...
结合以上知识点,可以通过一个具体的案例来演示如何在实际场景中使用事务和存储过程。例如,设计一个存储过程用于处理银行账户间的转账操作,其中包括事务的开启、SQL语句的执行、提交或者回滚等操作。 通过以上的...
例如,在网上购物场景中,一次交易可能涉及多个步骤,包括更新商品库存、保存付款信息、生成订单等。如果在这个过程中任何一个步骤出错,整个交易都应被视为失败,所有已执行的操作都需要回滚以保证数据的一致性。 ...
接下来,可以执行多个SQL语句并添加到批处理中,最后调用`executeBatch()`方法来一次性执行所有SQL语句。如果这些操作成功,则通过`commit()`方法将更改保存到数据库;如果发生异常,则调用`rollback()`方法撤销所有...
简单来说,一次大的操作由不同的小操作组成,这些小的操作分布在不同的服务器上,且属于不同的应用,分布式事务需要保证这些小操作要么全部成功,要么全部失败。本质上来说,分布式事务是为了保证不同数据库的数据...
1. **事务大小调整**:过大的事务可能导致长时间锁定资源,影响其他事务执行,应适当控制事务的大小,避免一次性处理过多数据。 2. **事务隔离级别选择**:数据库通常提供四种隔离级别:读未提交(Read Uncommitted...