v$transaction——列出系统的活动事务处理!

本文通过具体示例展示了如何使用Oracle数据库中的不同用户来观察事务的状态,并详细解释了v$transaction视图中used_ublk、used_now和used_later等字段的作用,以及它们在回滚过程中的意义。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

首先用u1用户构造一个事务:

SQL> show user
USER 为 "U1"
SQL> update t1 set id = 1 where name = 'a';

已更新 1 行。

用sys用户查看:

SQL> show user
USER 为 "SYS"
SQL> select s.username,t.status from v$transaction t,v$session s where t.addr = s.taddr;

USERNAME                       STATUS
------------------------------ ----------------
U1                             ACTIVE



V$SESSION taddr ,paddr 分别对应 v$transaction  addr,V$PROCESS addr

v$transaction的used_ublk可以查看进度
used_ublk 在做回滚时有多少块在使用
used_now 现在有多少块在使用
used_later 在60秒后有多少块使用
(used_later /used_ublk - used_later ) = ???多少时间rollback


ORACLE数据库的系统参数都存储在数据库中,可以通过SQLPLUS,以用户SYSYTEM进行查询。几个重要的表或者视图如下: v$controlfile:控制文件的信息; v$datafile:数据文件的信息; v$log:日志文件的信息; v$process:处理器的信息; v$session:会话信息; v$transaction:事务信息; v$resource:资源信息; v$sga:系统全局区的信息。 上面的视图名中的‘v$’,只是视图名字中的字符。类似于上面的视图或表还有很多,位于: $ORACLE_HOME/RDBMS/ADMIN/CATALOG.SQL文件中。 这些视图或表可以在SQLPLUS中用SELECT语句进行查询。 2.数据字典视图 表和列 DBA_TABLES、ALL_TABLES和USER_TABLES显示了有关数据库表的一般信息。 DBA_TAB_COLUMNS、ALL_TAB_COLUMNS和USER_TAB_COLUMNS显示了每个数据库表的列的信息。 注意:DBA_OBJECTS、ALL_OBJECTS和USER_OBJECTS显示了模式对象的信息,包括表。 完整性约束 DBA_CONSTRAINTS、ALL_CONSTRAINTS和USER_CONSTRAINST显示有关约束的一般信息。 DBA_CONS_COLUMNS、ALL_CONS_COLUMNS和USER_CONS_COLUMNS显示有关列的相关约束的一般信息。 视图 DBA_VIEWS、ALL_VIEWS和USER_VIEWS。 注意:DBA_OBJECTS、ALL_OBJECTS和USER_OBJECTS显示了模式对象的信息,包括视图。 序列 DBA_SEQUENCES、ALL_SEQUENCES和USER_SEQUENCES。 注意:DBA_OBJECTS、ALL_OBJECTS和USER_OBJECTS显示了模式对象的信息,包括序列。 同义词 DBA_SYNONYMS、ALL_SYNONYMS和USER_SYNONYMS。 注意:DBA_OBJECTS、ALL_OBJECTS和USER_OBJECTS显示了模式对象的信息,包括同义词。 索引 DBA_INDEXS、ALL_INDEXS、USER_INDEXS、DBA_IND_COLUMNS、ALL_IND_COLUMNS和USER_IND_COLUMNS。 用户 DBA_USERS。 角色 DBA_ROLES。 表空间定额 DBA_TS_QUOTAS。 配置表 DBA_PROFILES。 表空间 DBA_TABLESPACES。 数据文件 DBA_DATA_FILES。 段 DBA_SEGMENTS、USER_SEGMENT。 回滚段 DBA_ROLLBACK_SEGS、V$ROLLNAME、V$ROLLSTAT。
4.3 事务的传播机制 REQUIRED (默认) 支持当前事务,如果当前没有事务,则新建事务 如果当前存在事务,则加入当前事务,合并成一个事务 REQUIRES_NEW 新建事务,如果当前存在事务,则把当前事务挂起(无论当前环境是否有事物) 这个方法会独立提交事务,不受调用者的事务影响,父级异常,它也是正常提交 NESTED 如果当前存在事务,它将会成为父级事务的一个子事务,方法结束后并没有提交,只有等父事务结束才提交 如果当前没有事务,则新建事务 如果它异常,父级可以捕获它的异常而不进行回滚,正常提交 但如果父级异常,它必然回滚,这就是和 REQUIRES_NEW 的区别 SUPPORTS 如果当前存在事务,则加入事务 如果当前不存在事务,则以非事务方式运行,这个和不写没区别 NOT_SUPPORTED 以非事务方式运行 如果当前存在事务,则把当前事务挂起 MANDATORY 如果当前存在事务,则运行在当前事务中 如果当前无事务,则抛出异常,也即父级方法必须有事务 NEVER 以非事务方式运行,如果当前存在事务,则抛出异常,即父级方法必须无事务 一般用得比较多的是 REQUIRED, REQUIRES_NEW; REQUIRES_NEW 一般用在子方法需要单独事务。 @Transactional(propagation = Propagation.REQUIRED) 4.4 事务的失效场景 ———————————————— 版权声明:本文为CSDN博主「Gao_xu_sheng」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/Gao_xu_sheng/article/details/136727470
最新发布
07-16
<think>首先,用户的问题是:“我想理解事务传播机制及其在Spring框架中的应用 请问Spring框架中事务传播机制的详解及使用场景”。这基于系统级指令和提供的引用。 系统级指令: - 所有行内数学表达式用$...$格式。 - 独立公式用$$...$$格式并单独成段。 - LaTeX语法正确。 - 使用中文回答。 - 生成相关问题。 - 在回答中引用的段落末尾自然地添加引用标识,如[^1]。 用户可见层: - 回答结构清晰,帮助用户逐步解决问题。 - 保证回答真实可靠。 提供的引用: - [^1]: Spring事务的定义、实现、隔离级别和传播机制。 - [^2]: 事务传播机制的解释,为什么需要它。 - [^3]: Spring事务机制总结,包括PlatformTransactionManager和TransactionDefinition。 - [^4]: Spring事务基于代理实现,使用异常控制事务。 - [^5]: REQUIRED传播行为的详细说明。 我需要构建一个结构清晰的回答,逐步解释事务传播机制及其在Spring中的应用。 大纲: 1. **介绍事务传播机制**:定义什么是事务传播机制,为什么需要它。 2. **Spring框架中的传播机制**:解释Spring如何实现事务传播。 3. **传播行为的类型**:列出并解释Spring中常见的传播行为。 4. **使用场景**:提供每个传播行为的典型使用场景。 5. **示例和代码**:可能包括代码片段来演示。 6. **总结**:强调关键点。 7. **生成相关问题**:在回答末尾添加相关问题。 确保使用中文回答。 生成相关问题:在回答末尾,添加§§相关问题§§部分,列出2-3个相关问题。 引用标识:在回答中,当引用提供的引用内容时,自然地添加[^n]。 内容基于引用: - 事务传播机制描述事务在多个方法间如何流转[^2]。 - Spring使用代理技术控制事务[^4]。 - 传播行为类型如REQUIRED[^5]。 - 隔离级别等[^1]。 详细步骤: 1. **引言**:简要介绍事务传播机制及其重要性。 2. **定义**:解释事务传播机制是什么。 - 引用[^2]:事务传播是Spring引入的概念,用于管理事务在多个方法间的流转。 3. **Spring实现**:描述Spring如何实现事务传播。 - 引用[^4]:Spring使用代理技术,基于异常控制事务。 - 引用[^3]:PlatformTransactionManager和TransactionDefinition的作用。 4. **传播行为类型**:详细说明Spring中的传播行为。 - 基于[^5]和[^1],列出常见行为: - REQUIRED(默认) - REQUIRES_NEW - SUPPORTS - MANDATORY - NOT_SUPPORTED - NEVER - NESTED - 解释每个行为,包括使用场景。 5. **使用场景**:提供具体示例。 - 例如,REQUIRED用于大多数业务方法;REQUIRES_NEW用于独立事务。 6. **代码示例**:可能包括一个简单的Spring事务代码。 - 使用Java代码,展示@Transactional注解。 7. **总结**:回顾关键点。 8. **相关问题**:生成相关问题。 确保回答真实可靠,基于提供的引用和常识。 最终输出格式: - 回答主体。 - 末尾有§§相关问题§§。</think>### Spring框架中事务传播机制的详解及使用场景 事务传播机制是Spring框架中管理数据库事务的核心概念之一,它定义了事务在多个方法调用间如何传播和流转。这在分布式系统和复杂业务逻辑中尤为重要,因为它确保了数据的一致性和完整性。下面我将逐步解释事务传播机制的定义、Spring实现原理、常见传播行为类型及其使用场景,帮助您全面理解。 #### 1. **事务传播机制的定义与重要性** - **什么是事务传播机制?** 事务传播机制描述了当一个事务方法调用另一个事务方法时,新事务如何与现有事务交互。它解决了“多个方法是否需要共享同一个事务,或创建新事务”的问题。例如,如果方法A已开启事务,调用方法B时,B可能加入A的事务,也可能独立开启新事务。 事务本身没有传播概念,这是Spring为简化事务管理而引入的抽象机制[^2]。本质上,它控制事务的边界和行为,确保ACID属性(原子性、一致性、隔离性、持久性)在方法链中得以维护。 - **为什么需要事务传播机制?** 在Java应用中,业务逻辑往往涉及多层方法调用(如Service层调用DAO层)。如果没有传播机制,事务可能无法正确回滚或提交,导致数据不一致。Spring的传播机制通过代理技术动态管理事务,基于异常决定提交或回滚[^4]。这提高了代码的可维护性和可靠性。 #### 2. **Spring框架中事务传播的实现原理** - **基于代理的实现** Spring使用动态代理(JDK动态代理或CGLib)来拦截方法调用。当方法被`@Transactional`注解标记时,代理类会捕获异常:如果方法抛出异常,事务回滚;否则提交。这使事务控制与业务逻辑解耦[^4]。 例如,一个Service方法调用DAO方法时,代理会根据传播行为决定是否开启新事务。 - **核心接口:PlatformTransactionManager 和 TransactionDefinition** - `PlatformTransactionManager`是事务管理接口,负责事务的创建、提交和回滚。它根据`TransactionDefinition`中定义的传播行为、隔离级别等参数执行操作[^3]。 - `TransactionDefinition`封装事务属性,如超时时间、隔离级别和传播行为。传播行为通过`@Transactional(propagation = Propagation.XXX)`设置。 - **关键点:事务的传播基于方法调用栈** Spring在方法调用链中维护事务上下文。如果内层方法抛出异常,传播机制会决定是否影响外层事务。例如,默认的`REQUIRED`行为中,内层方法异常会导致整个事务回滚,即使外层有try-catch[^5]。 #### 3. **Spring中的事务传播行为类型及详解** Spring定义了7种传播行为,每种适用于不同场景。以下是常见类型及其使用场景(基于`org.springframework.transaction.annotation.Propagation`枚举)。 | 传播行为类型 | 描述 | 使用场景 | 示例场景 | |--------------|------|----------|----------| | **REQUIRED** (默认) | 如果当前存在事务,则加入该事务;否则新建一个事务。 | 大多数业务方法,如订单处理:下单和支付需在同一事务中保证原子性。 | 用户下单时,`OrderService.createOrder()`调用`PaymentService.processPayment()`,两者共享事务。如果支付失败,整个订单回滚[^5]。 | | **REQUIRES_NEW** | 始终新建一个独立事务。如果当前存在事务,则挂起它,新事务提交后恢复原事务。 | 需要独立操作的场景,如日志记录:日志写入不应影响主业务事务。 | 在转账服务中,`TransferService.transfer()`调用`AuditService.logAction()`。日志记录失败不影响转账事务,因为`logAction`使用`REQUIRES_NEW`[^1]。 | | **SUPPORTS** | 如果当前存在事务,则加入;否则以非事务方式执行。 | 查询操作,如数据读取:不需要事务保证,但能利用现有事务。 | `ReportService.generateReport()`读取数据,如果被事务方法调用则加入事务,否则直接执行。 | | **MANDATORY** | 必须在现有事务中运行,否则抛出异常。 | 强制依赖事务的场景,如资金扣减:确保方法不会在无事务环境下调用。 | `AccountService.deductBalance()`要求调用方必须开启事务,避免数据不一致。 | | **NOT_SUPPORTED** | 以非事务方式执行,如果当前存在事务,则挂起它。 | 耗时操作,如文件处理:避免事务长时间持有锁。 | `FileService.uploadFile()`在事务方法中被调用,但文件上传不参与事务。 | | **NEVER** | 必须在无事务环境下运行,否则抛出异常。 | 只读操作,如缓存加载:确保方法不会意外加入事务。 | `CacheService.loadData()`禁止在事务中调用,防止不必要的事务开销。 | | **NESTED** | 在现有事务中创建嵌套子事务。子事务可独立回滚,不影响父事务;但父事务回滚会导致子事务回滚。 | 部分失败可恢复的场景,如电商购物车:添加商品失败不影响整个订单。 | `CartService.addItem()`作为嵌套事务,如果商品库存不足只回滚添加操作,但`OrderService.checkout()`的父事务继续[^1]。 | 数学表达:事务的传播行为可以形式化为一个状态机。例如,设$T$为当前事务状态,$P$为传播行为类型,则新事务的创建规则可表示为: $$ \text{NewTransaction} = \begin{cases} \text{true} & \text{if } P = \text{REQUIRES\_NEW} \\ \text{false} & \text{if } T \neq \text{null} \text{ and } P = \text{REQUIRED} \\ \text{error} & \text{if } T = \text{null} \text{ and } P = \text{MANDATORY} \end{cases} $$ 这描述了传播行为如何决策事务边界。 #### 4. **典型使用场景与代码示例** - **场景1:电商订单处理(REQUIRED 和 NESTED)** 用户下单涉及多个步骤:创建订单、扣减库存、支付。使用`REQUIRED`确保所有操作在一个事务中。如果库存扣减失败,整个事务回滚。 ```java @Service public class OrderService { @Transactional(propagation = Propagation.REQUIRED) public void placeOrder(Order order) { inventoryService.deductStock(order); // REQUIRED传播,加入事务 paymentService.processPayment(order); // 同上 } } ``` 如果库存扣减需独立处理(如部分商品缺货),可用`NESTED`: ```java @Transactional(propagation = Propagation.NESTED) public void deductStock(Order order) { // 扣减库存逻辑 } ``` - **场景2:审计日志(REQUIRES_NEW)** 日志记录应独立于业务事务,避免日志失败影响主流程。 ```java @Service public class AuditService { @Transactional(propagation = Propagation.REQUIRES_NEW) public void logAction(String action) { // 日志写入数据库 } } ``` - **场景3:批量数据处理(NOT_SUPPORTED)** 大数据导入时,避免事务锁定资源。 ```java @Transactional(propagation = Propagation.NOT_SUPPORTED) public void importData(List<Data> dataList) { // 非事务处理 } ``` 注意事项: - 传播行为的选择影响性能:例如,`REQUIRES_NEW`创建新事务会增加开销。 - 异常处理:Spring事务基于异常回滚。默认只回滚`RuntimeException`和`Error`,可通过`@Transactional(rollbackFor = Exception.class)`自定义[^4]。 - 隔离级别配合:传播行为常与隔离级别(如`READ_COMMITTED`)结合使用,防止脏读或幻读[^1]。 #### 5. **总结与最佳实践** - **关键总结**:事务传播机制是Spring事务管理的核心,它通过代理和接口动态控制事务边界。默认`REQUIRED`适合大多数场景,而`REQUIRES_NEW`和`NESTED`提供灵活性。正确使用传播机制能提升系统健壮性,避免数据不一致。 - **最佳实践**: - 优先使用默认`REQUIRED`,减少事务嵌套复杂度。 - 对独立操作(如日志)使用`REQUIRES_NEW`。 - 避免在频繁调用的方法中使用`REQUIRES_NEW`以防性能问题。 - 结合隔离级别设置(如`@Transactional(isolation = Isolation.READ_COMMITTED)`)以优化并发控制[^3]。 通过以上详解,您应该能理解事务传播机制在Spring中的应用。如果您有具体代码或场景,可以提供更多细节以深入分析。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值