`
pouyang
  • 浏览: 321585 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Spring 事务管理-3

阅读更多
接续 Spring 事务管理-2


摘自:http://tidus2005.iteye.com/blog/398672

最近一个项目中发现了一个严重的问题,就是系统上线的回归测试时发现系统存在锁表的问题,直接导致事务不能结束(提交货品回滚),最终造成连接得不到释放,进而当开启的连接超过连接池的最大连接数时,系统将提示获取不到连接,从而崩溃!



    一般的系统采用的都是Spring提供的声明式事务。而我们系统由于历史遗留问题,采用了offbiz的基于模型配置的架构体系,此套体系中事务的开启以及关闭都是通过编程式事务完成。编程式事务在事务范围控制方面比较灵活,但是在灵活的同时也存在潜在的风险。如果事务开启后没有正常结束,那么事务也就会一直占用连接而得不到释放。虽然可以通过设置事务超时值从而在事务超时杀掉事务释放连接,这种方式个人觉得还是存在一定得不可控性。所以对于编程式事务的使用,还应该注意一下几点:



    第一点,有开有关:事务管理层有事务开启必须有事务关闭,可以通过设置事务旗标在finally中进行事务管理;示意性代码如下:



    第二点,单一出口:即一个方法的renturn只有一处,异常情况通过throw 抛出,确保最外层事务管理层能够通过捕获到得异常控制事务状态(提交或回滚)。



    第三点,设置事务超时:事务执行超过指定时间,强制杀掉事务,关闭连接,从而确保其他业务不会应为该事务锁定相关业务表而阻塞而导致恶性循环。



    如果怀疑表被锁了,或者事务未被正常关闭,在Oracle数据库中我们可以通过以下语句进行查询获取相关信息:



select t2.username,   
       t2.sid,   
       t2.serial#,   
       t3.object_name,   
       t2.OSUSER,   
       t2.MACHINE,   
       t2.PROGRAM,   
       t2.LOGON_TIME,   
       t2.COMMAND,   
       t2.LOCKWAIT,   
       t2.SADDR,   
       t2.PADDR,   
       t2.TADDR,   
       t2.SQL_ADDRESS,   
       t1.LOCKED_MODE   
  from v$locked_object t1, v$session t2, dba_objects t3   
 where t1.session_id = t2.sid   
   and t1.object_id = t3.object_id   
 order by t2.logon_time;  




大家发现,上面这条SQL语句用到了Oracle的两个视图和一个表,分别是v$locked_object、v$session、dba_objects:

     v$locked_object 视图中记录了所有session中的所有被锁定的对象信息。

     v$session 视图记录了所有session的相关信息。

     dba_objects 为oracle用户对象及系统对象的集合,通过关联这张表能够获取被锁定对象的详细信息。



     v$locked_object中的LOCKED_MODE字段表示锁的模式,oracle中锁的模式有如下几种:



     0:none
    1:null 空
    2:Row-S 行共享(RS):共享表锁,sub share 
    3:Row-X 行独占(RX):用于行的修改,sub exclusive 
    4:Share 共享锁(S):阻止其他DML操作,share
    5:S/Row-X 共享行独占(SRX):阻止其他事务操作,share/sub exclusive 
    6:exclusive 独占(X):独立访问使用,exclusive



数字越大锁级别越高, 影响的操作越多。

1级锁有:Select,有时会在v$locked_object出现。
2级锁有:Select for update,Lock For Update,Lock Row Share 
select for update当对话使用for update子串打开一个游标时,所有返回集中的数据行都将处于行级(Row-X)独占式锁定,其他对象只能查询这些数据行,不能进行update、delete或select for update操作。
3级锁有:Insert, Update, Delete, Lock Row Exclusive
没有commit之前插入同样的一条记录会没有反应, 因为后一个3的锁会一直等待上一个3的锁, 我们必须释放掉上一个才能继续工作。
4级锁有:Create Index, Lock Share
locked_mode为2,3,4不影响DML(insert,delete,update,select)操作, 但DDL(alter,drop等)操作会提示ora-00054错误。
00054, 00000, "resource busy and acquire with NOWAIT specified"
// *Cause: Resource interested is busy.
// *Action: Retry if necessary.
5级锁有:Lock Share Row Exclusive 
具体来讲有主外键约束时update / delete ... ; 可能会产生4,5的锁。
6级锁有:Alter table, Drop table, Drop Index, Truncate table, Lock Exclusive



     附上几条简单的oracle系统查询语句:



--查某session 正在执行的sql语句,从而可以快速定位到哪些操作或者代码导致事务一直进行没有结束等.
SELECT /*+ ORDERED */ 
 sql_text
  FROM v$sqltext a
 WHERE (a.hash_value, a.address) IN
       (SELECT DECODE(sql_hash_value, 0, prev_hash_value, sql_hash_value),
               DECODE(sql_hash_value, 0, prev_sql_addr, sql_address)
          FROM v$session b
         WHERE b.sid = '233')  /* 此处233 为SID*/
 ORDER BY piece ASC;


--查进程.
select * from v$process ; 



--查缩
 
 select * from v$lock; 


--查缩定的对象
select * from v$locked_object


--查事务
select * from v$transaction 


--查session
 select v.* from v$session v where machine='xxx' and username='xxx' and status='INACTIVE' order by last_call_et desc


--查dba_objects对象
select * from dba_objects 
where object_id = '14977'
 
--查缩定的表
select t2.username,t2.sid,t2.serial#,t3.object_name,t2.OSUSER,t2.MACHINE,t2.PROGRAM,t2.COMMAND,t2.LAST_CALL_ET
        from v$locked_object t1,v$session t2 ,dba_objects t3
        where t1.session_id=t2.sid  and t1.object_id = t3.object_id
        order by t2.logon_time;




我们可以用下面SQL语句杀掉长期没有释放非正常的锁:

  
alter system kill session 'sid,serial#'; 

分享到:
评论

相关推荐

    Spring框架(spring-framework-5.2.6.RELEASE)的jar包

    - `spring-tx-5.2.6.RELEASE.jar`:事务管理服务,支持编程式和声明式事务处理。 - `spring-web-5.2.6.RELEASE.jar` 和 `spring-webmvc-5.2.6.RELEASE.jar`:Web相关的模块,分别对应基础Web支持和MVC框架。 每个...

    spring-cglib-repack-3.2.5.jar,spring-objenesis-repack-2.6.jar

    在Spring中,当一个类没有实现接口时,Spring会使用CGLIB来创建代理对象,以便在不修改原有代码的情况下,为对象添加额外的功能,如事务管理、性能监控等。CGLIB的repack版本是对原始CGLIB库的重新打包,目的是为了...

    spring-tx-5.0.0.0.RELEASE.jar_java开发_spring-tx-5.0.0_

    《深入解析Spring TX 5.0.0:构建高效事务管理》 在Java开发领域,Spring框架以其强大的功能和灵活性而备受青睐。其中,Spring TX模块是Spring框架的重要组成部分,专注于提供事务管理服务。本文将深入探讨Spring ...

    spring-context-3.2.0 spring-core-3.2.0 等齐全的Spring jar包

    10. **spring-tx-3.2.0.RELEASE.jar**:事务管理模块提供了编程和声明式的事务管理,支持JTA(Java Transaction API)和本地事务。这使得在Spring应用中管理事务变得容易。 这组Spring 3.2.0库的完整集合,为开发者...

    spring导入eclipse时少的spring-cglib-repack-3.2.4.jar和spring-objenesis-repack-2.4.jar

    通过这种方式,Spring能够注入切面逻辑,比如日志记录、事务管理等,即使在不修改原有代码的情况下也能实现扩展功能。 其次,`spring-objenesis-repack-2.4.jar`是Objenesis库的一个版本,Objenesis是一个用于创建...

    spring-aop-jar

    Spring AOP模块提供了实现AOP规范的功能,它允许开发者定义“切面”来封装系统中的横切关注点,如日志、事务管理等。该jar文件包含了Spring AOP的核心类和接口,如`org.springframework.aop.*`包下的`...

    spring-framework-2.5-rc2-with-dependencies\spring-framework-2.5-rc2\spring-framework-2.5-rc2docs

    在事务管理方面,Spring 2.5进一步完善了声明式事务管理,允许开发者通过注解或XML配置来定义事务边界,减少了手动处理事务的复杂性。此外,对JDBC、Hibernate、JPA等多种持久层技术的集成,使Spring成为了数据库...

    Spring事务管理Demo

    Spring事务管理的目的是确保数据的一致性和完整性,尤其是在多操作、多资源的环境中。本Demo将深入探讨Spring如何实现事务的管理。 首先,Spring提供了两种主要的事务管理方式:编程式事务管理和声明式事务管理。 ...

    Spring事务处理-ThreadLocal的使用

    首先,了解Spring事务管理的基本概念。在多线程环境中,事务管理是至关重要的,它负责确保一组数据库操作要么全部成功,要么全部失败。Spring提供了两种主要的事务管理方式:编程式事务管理和声明式事务管理。声明式...

    spring-framework-1.0-with-dependencies.zip

    5. **spring-tx**:支持声明式事务管理,使得事务管理可以在不修改业务代码的情况下进行。 6. **spring-web**和**spring-webmvc**:这两个模块是Spring与Web应用的接口,前者提供HTTP Servlet的集成,后者则是...

    struts2-spring-plugin-2.2.1.jar

    3. **Spring事务管理**:插件允许Struts2的Action方法直接参与到Spring的事务管理中,无需关心事务的开启和提交。 4. **AOP集成**:结合Spring的AOP能力,可以为Struts2的Action提供切面增强,如性能监控、日志记录...

    spring4源码所需要的spring-objenesis-repack-2.1.jar,spring-cglib-repack-3.1.jar

    5. **AOP(面向切面编程)**: AOP是Spring框架的重要特性之一,允许开发者将关注点分离,如日志记录、事务管理等,从业务逻辑中解耦。Objenesis和CGLIB在这里起到了代理生成的作用,使得切面能够在不修改目标类的...

    官方原版spring-framework-4.3.18.RELEASE.zip

    通过阅读文档,开发者可以深入了解Spring MVC、数据访问、事务管理、测试等模块的使用方法。 "spring-framework-4.3.18.RELEASE-schema.zip"文件提供了Spring配置文件所使用的XML架构定义。这些架构文件定义了...

    spring-framework-5-0-0-m3-zh_cn

    Spring Framework 是一种轻量级的解决方案,是构建你...明式事务管理,通过RMI或Web服务远程访问你的逻辑,以及用于持久存储数据的各种选项。 它提供了一个全功能的 MVC 框架,并使你能够将 AOP 透明地集成到你的软件中

    spring-modules-0.9.zip

    在0.9版本中,Spring Modules可能已经包含了对Spring核心的扩展,比如AOP(面向切面编程)的增强,提供了一些预定义的切面,便于处理常见的企业级问题,如日志记录、事务管理等。同时,它可能还提供了对Spring IoC...

    spring-framework-4.3.5 所有JAR文件包

    - AOP允许开发者定义“方面”,这些方面封装了横切关注点,如日志记录、事务管理等。Spring AOP支持使用代理模式实现切面,包括基于类的代理和基于JDK动态代理。 4. **MVC框架**: - Spring MVC是Spring ...

    spring-data-redis 1.7.6

    4. **事务支持**:Spring Data Redis允许开发者使用`RedisTransactionManager`来管理Redis的事务,提供了与传统关系型数据库相似的事务操作能力,如BEGIN、COMMIT、ROLLBACK等。 5. **持久化策略**:Spring Data ...

    spring-data-commons-1.7.2.RELEASEspring-data-jpa-1.5.2.RELEASE-java datajpa

    1. **JPA 整合**:Spring Data JPA 提供了与 JPA 规范的无缝集成,包括实体管理、事务管理和数据源配置。 2. **EntityManager 和 Repository**:Spring Data JPA 封装了 `EntityManager` 和 `EntityTransaction`,...

    spring-framework-3.2.0.RELEASE-dependencies框架依赖包

    5. **事务管理**:Spring 提供了统一的事务管理接口,可以管理数据库事务以及基于JMS的消息事务。3.2.0版本提供了更灵活的编程和声明式事务管理策略。 6. **消息支持**:Spring 对Java消息服务(JMS)提供全面支持...

    spring-framework-4.3.8.RELEASE官方完整包加官方文档

    5. **声明式事务管理**:Spring的事务管理使得开发者可以声明性地控制事务边界,无需编写复杂的事务管理代码。 6. **Spring Boot**:虽然Spring Boot不是4.3.8.RELEASE的一部分,但在这个版本中,Spring Boot的兼容...

Global site tag (gtag.js) - Google Analytics