`

Spring管理Bean、Hibernate事务,造成死锁问题的解决方法【探索篇】

阅读更多

一、先介绍一下手头的项目情况:

      1、同时操作4个表,分别是25w、55W(CRUD操作),以及另外另个副表也是25w、55w(只写)。

      2、应该也是50-100人左右同时操作。

 

二、这几天遇到的问题,就是数据死锁,以下附上错误部分错误提示:

      事务(进程 ID  62)与另一个进程已被死锁在  lock 资源上,且该事务已被选作死锁牺牲品。请重新运行该事务。

      事务(进程 ID  63)与另一个进程已被死锁在  lock 资源上,且该事务已被选作死锁牺牲品。请重新运行该事务。

      事务(进程 ID  64)与另一个进程已被死锁在  lock 资源上,且该事务已被选作死锁牺牲品。请重新运行该事务。

      [Microsoft][SQLServer 2000 Driver for JDBC][SQLServer]事务(进程 ID  62)与另一个进程已被死锁在  lock 资源上,且该事务已被选作死锁牺牲品。请重新运行该事务。

 

三、这几天解决问题的过程中解决的各种思路以及各种经历(没有兴趣者可以略过,直接看后面的解决部分):

      1、怀疑Hibernate的findByProperty方法访问有问题。查找死锁的位置,发现只要是有以下获取list对象集的地方都会出错。

         

          

public List findByProperty(String propertyName, Object value) {
		log.debug("finding Persinfo instance with property: " + propertyName
				+ ", value: " + value);
		try {
			String queryString = "from Persinfo as model where model."
					+ propertyName + "= ?";
			return getHibernateTemplate().find(queryString, value);
		} catch (RuntimeException re) {
			log.error("find by property name failed", re);
			throw re;
		}
	}

           而且以下我们的写法很常用:

          

List list = persinfoDAO.findByPerscode(perscode);
		if(!list.isEmpty()){
			Persinfo persinfo = (Persinfo)list.get(0);。。。

 

           所以如果要改写非常繁琐,但是怎么看都觉得没有问题,放弃,继续查找原因。

 

      2、怀疑是数据库连接太小,已经查到了出现死锁的位置。

           (此处略去N个字)

      3、怀疑Spring管理了所有的数据,改写配置文件: 

           (此处略去N个字)

      4、怀疑某一个用户锁住了表,另外的用户读取失败。(比较靠谱了) 

           (此处略去N个字)

      5、对Hibernate以及C3P0的设置进行优化。 

           (此处略去N个字)

      6、最后发现,是一个用户对表进行操作,操作之前事务会把表锁住,然后事务没有及时提交(解锁),就对表进行读取,造成了自己(的读取)对自己(提交写等操作的缓冲)进行等待,造成死锁。

 

四、解决方法:

      1、在业务层的一个方法里面:

          

Persinfo persinfo = (Persinfo)list.get(0);
                        ...
			persinfoDAO.update(persinfo);
                        ...
			if(...){
                                ...
				t402DAO.update(t402);
		        }
			if(...){
                                ...
				familyDAO.merge(family);
				if(...){
                                        ...
					t403DAO.update(t403);
				}
                                ...
				famifundDAO.update(famifund);
                                ...

				//硬性提交事务
				familyDAO.getHibernateTemplate().flush();
				t403DAO.getHibernateTemplate().flush();
				famifundDAO.getHibernateTemplate().flush();

           注意点:多个操作完成之后,一次性进行flush进行事务提交。

           其他思路:可以用AOP对业务层的某一个业务的所有方法进行定义,比如只读,或者整体事务,然后在Spring的配置文件进行配置。

 

五、附上我查阅资料之后发现的几个需要掌握的知识点:

      1、Spring集成Hibernate,C3P0的设置参数。

      2、事务隔离级别。

      3、Spring对于事务管理的几种方式。

      4、AOP的作用。

 

后记:

      因为时间仓促,加之自己的理解还不够透彻,稍后有空了,再整理一下,把Spring管理Bean、Hibernate事务的一些原理解剖清楚,再发表给大家。

 

 

分享到:
评论
2 楼 Samter 2011-03-29  
ppgunjack 写道
数据库不一样,机制不一样
一个事务自己锁自己应该不太可能吧,锁都是自己拿了,自然就不会申请锁,所以也不会wati自己放锁,那就不可能死锁

它是这样子的,Spring管理下的Hibernate自动加了事务,一开始先把表给锁住,然后进行操作,但是事务的设置或者别的一些问题,导致没有自动提交事务,但是还没有提交的事务的时候又立刻对数据进行读操作。
1 楼 ppgunjack 2011-03-25  
数据库不一样,机制不一样
一个事务自己锁自己应该不太可能吧,锁都是自己拿了,自然就不会申请锁,所以也不会wati自己放锁,那就不可能死锁

相关推荐

    JavaAnd数据库事务[整理].pdf

    Java 和数据库事务是软件开发中的核心概念,尤其是在构建企业级应用程序时。...Spring等框架的出现使得事务管理变得更加方便,但也需要开发者深入理解事务原理,以便在遇到问题时能迅速定位和解决。

    hibernate数据源

    - **Transaction Management**:Hibernate 提供了基于 JTA 和 JDBC 的事务管理策略,可以根据应用的需求选择合适的模式。 - **Connection Pooling**:数据源通常与连接池配合使用,以提高数据库操作效率,减少资源...

    架构师学习线路图,详细介绍java学习线路图,包括java多线程并发,JVM,spring,springboot,s.zip

    学习Spring包括了解IoC容器、Bean生命周期管理、Spring MVC、数据访问支持(如JDBC、Hibernate、MyBatis)以及Spring Boot的自动配置等。 4. **SpringBoot**:SpringBoot简化了Spring应用的初始搭建和配置工作,它...

    Java面试题汇总

    11. **Spring框架**:依赖注入(DI)和面向切面编程(AOP),Spring的Bean管理,事务管理,Spring MVC的工作原理,以及Spring Boot和Spring Cloud的应用。 12. **Hibernate**:ORM框架的使用,HQL查询语言,懒加载...

    java面试题

    4. EJB:实体Bean、会话Bean和消息驱动Bean的用途,以及容器管理的事务(CMT)和bean管理的事务(BMT)。 5. JMS:消息队列的工作原理,以及MessageProducer和MessageConsumer的角色。 最后,S2SH是Java EE中常用的...

    Java面试精选(基础 框架 数据库等)

    1. Spring框架的核心模块:Core Container(Bean管理)、AOP、DAO支持、Web支持等。 2. Spring Boot的特性:自动配置、起步依赖、内嵌Web服务器等。 3. Spring Cloud:分布式系统解决方案,如服务发现(Eureka)、...

    Java习题.rar

    面试中可能涉及Bean的生命周期、AOP的实现方式、Spring MVC的工作流程、事务管理、Spring Boot的特性、Spring Data JPA或MyBatis的集成等。 4. **Hibernate框架**:Hibernate是一个强大的对象关系映射(ORM)框架,...

    Java面试资料(最全面的java面试题库SSH)

    - 多线程:线程的创建方式,同步机制,死锁问题及解决方案。 - 异常处理:异常的分类,何时抛出异常,如何捕获和处理异常。 2. **Spring框架**: - IoC(控制反转)与DI(依赖注入):理解其概念和作用,以及在...

    东南融通面试题 内部

    - 通过Spring的事务管理、配置管理等功能,可以方便地整合Hibernate。 3. **Spring AOP的实现方式及其优缺点:** - Spring AOP主要通过代理机制实现,支持静态代理和动态代理。 - 优点包括解耦、易于维护等,...

    java面试题集锦

    - JPA/Hibernate:ORM框架,实体管理,事务处理,SQL映射。 - EJB:会话bean,实体bean,消息驱动bean,依赖注入。 - Spring框架:IOC,AOP,MVC,Spring Boot,Spring Data,Spring Security。 - MVC架构:Web...

    JAVA面试题

    总的来说,对于Java面试,你需要深入理解上述四个框架的核心概念和使用方法,同时具备良好的问题解决能力和代码调试技巧。熟悉常见的设计模式,了解并发编程和性能优化策略,以及对最新Java版本特性的了解,都将增加...

    Jbpm工作流与ssh框架集成文档

    例如,可以配置Spring的bean来管理Jbpm的session,解决Jbpm与Hibernate session不一致的问题。 7. **编写人机交互界面**:在Struts的Action中,配置流程的启动和控制,创建相应的视图(如JSP页面),以便用户能够...

    多次面试考题总结.zip

    重点知识点包括EJB的三种类型(会话bean、实体bean和消息驱动bean)、生命周期管理、容器服务、JNDI查找、事务管理以及远程方法调用。理解EJB的角色和在分布式环境中的作用是面试中的常见问题。 3. **Struts2**:...

    Java开发面试题整理含答案(计网、Java、操作系统、数据库、框架)

    对于Java开发者,了解操作系统的基本原理如进程与线程、内存管理、虚拟内存、文件系统、I/O操作、死锁等,能够帮助解决实际开发中的问题。面试中,你可能需要讨论进程间的通信方式、操作系统的调度算法或解释内存...

    Java 全套面试题.doc

    Spring框架是企业级Java开发的核心,提供了依赖注入、AOP(面向切面编程)、事务管理等功能。Spring MVC是Spring框架的一部分,用于构建Web应用。面试中会询问IoC容器、Bean的生命周期、AOP的应用等。 【Spring ...

    java面试问题汇总(非常全面)

    Spring 可以管理 Hibernate 的 SessionFactory,提供事务管理,并集成 Hibernate 的 DAO 支持。 #### 57. doGet()和doPost()作用,有什么区别? - **doGet**:处理 GET 请求,通常用于检索数据。 - **doPost**:...

    更新JAVA工程师面试题

    - **EJB容器管理的事务(CMT)和 bean管理的事务(BMT)**:理解事务的ACID属性。 - **远程接口和本地接口**:EJB如何进行远程调用和同部署应用间的交互。 6. **Spring框架** - **依赖注入(DI)**:理解依赖...

    并发编程面试题以及答案.docx

    并发编程面试题以及答案 ...* Spring:Bean 的生命周期、AOP、事务的传播属性等,各自的概念、应用场景和实现。 * SpringMVC 或 Struts:处理请求的流程和实现。 * Spring AOP:解决问题、实现和应用场景。

    j2ee面试试题汇总大全

    - **分布式事务**:如何在EJB或Spring中管理跨多个资源的事务。 - **XAResource**:参与全局事务的资源需实现此接口。 10. **Spring框架** - **依赖注入(DI)与面向切面编程(AOP)**:Spring的核心特性,简化...

    java华为面试题.zip

    - JPA或Hibernate:对象关系映射,CRUD操作,事务管理。 - 数据库事务的ACID特性。 10. **网络编程** - TCP/IP协议:三次握手,四次挥手,拥塞控制。 - Socket编程:客户端与服务器端的通信实现。 以上只是...

Global site tag (gtag.js) - Google Analytics