0 0

mysql 发生死锁问题请求帮助0

昨天晚上新系统上线确发生了数据库死锁现象,从异常来看是执行存储过程的时候发生的:
AutoId(?,?,?)}]; Deadlock found when trying to get lock; try restarting transaction; nested exception is com.mysql.jdbc.exceptions.jdbc4.MySQLTransactionRoll
backException: Deadlock found when trying to get lock; try restarting transaction
org.springframework.dao.DeadlockLoserDataAccessException: CallableStatementCallback; SQL [{call Get_AutoId(?,?,?)}]; Deadlock found when trying to get lock; 
try restarting transaction; nested exception is com.mysql.jdbc.exceptions.jdbc4.MySQLTransactionRollbackException: Deadlock found when trying to get lock; tr
y restarting transaction
	at org.springframework.jdbc.support.SQLErrorCodeSQLExceptionTranslator.doTranslate(SQLErrorCodeSQLExceptionTranslator.java:265)
	at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:72)
	at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:1030)
	at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:1042)


上线前测试的时候从未发现,可能是上线后大数据造成的,我在系统的service层上加了事务
 <!--配置事务的传播特性 -->  
    <tx:advice id="txAdvice" transaction-manager="springTransactionManager">  
        <tx:attributes>  
            <!-- 对增、删、改方法进行事务支持 -->  
            <tx:method name="insert*" propagation="REQUIRED"  rollback-for="com.mailbill.datacore.exception.MailBillBusinessException"/>
            <tx:method name="add*" propagation="REQUIRED" rollback-for="com.mailbill.datacore.exception.MailBillBusinessException"/>  
            <tx:method name="create*" propagation="REQUIRED" rollback-for="com.mailbill.datacore.exception.MailBillBusinessException"/>  
            <tx:method name="save*" propagation="REQUIRED" rollback-for="com.mailbill.datacore.exception.MailBillBusinessException"/>  
            <tx:method name="edit*" propagation="REQUIRED" rollback-for="com.mailbill.datacore.exception.MailBillBusinessException"/>  
            <tx:method name="update*" propagation="REQUIRED" rollback-for="com.mailbill.datacore.exception.MailBillBusinessException"/>  
            <tx:method name="delete*" propagation="REQUIRED" rollback-for="com.mailbill.datacore.exception.MailBillBusinessException"/>  
            <tx:method name="remove*" propagation="REQUIRED" rollback-for="com.mailbill.datacore.exception.MailBillBusinessException"/>
            <tx:method name="set*" propagation="REQUIRED" rollback-for="com.mailbill.datacore.exception.MailBillBusinessException"/>   
            <!-- 对查找方法进行只读事务 -->  
            <tx:method name="select*" propagation="SUPPORTS" read-only="true" />  
            <tx:method name="find*" propagation="SUPPORTS" read-only="true" />
            <tx:method name="get*" propagation="SUPPORTS" read-only="true" />
            <!-- 对其它方法进行只读事务 -->  
            <tx:method name="*" propagation="SUPPORTS" read-only="true" />  
        </tx:attributes>  
    </tx:advice>  


而这个存储过程是在dao层执行的。
我的存储过程如下:
DELIMITER $$

CREATE DEFINER=`root`@`%` PROCEDURE `Get_AutoId`(
Id VARCHAR(255),
TableName VARCHAR(255),
OUT outId VARCHAR(255)
)
BEGIN  
    START TRANSACTION;
	SET @s= CONCAT('REPLACE INTO `',TableName,'_AutoId`  (`Code`) VALUES (1);');

	PREPARE s_cnt FROM @s; 
	EXECUTE s_cnt; 
	DEALLOCATE PREPARE s_cnt; 

	SELECT LAST_INSERT_ID() INTO @outId;

	SET OutId = CONCAT(Id,'_',@outId);
	commit;
END


还请大伙帮忙看看是哪有问题!
2013年7月09日 10:30

5个答案 按时间排序 按投票排序

0 0

[list]
[*]
引用
[/list]
||||||
|||||
|||||
||||
||||
|||
|||
||
||
|
|

2018年1月04日 15:13
0 0

不要用“REPLACE INTO ”语句,如果索引设置不当会引起死锁。

2013年7月10日 22:28
0 0

目测不是因为存储过程内sql导致的死锁:
因为存储过程内只有一条insert语句会持有锁,也只持有一把锁。所以不会导致死锁。

2013年7月10日 10:13
0 0

   引起死锁肯定是由于资源共享冲突,事务是保证一个操作单元能执行顺利或失败,保证数据的完整性的。
   对于资源冲突肯定是需要锁来控制,也就是使用数据的隔离机制和同步锁来控制的,数据库的隔离机制修改影响会比较大,所以建议在dao层使用同步或者加锁来防止deadlock
但是可能会影响部分性能

个人建议,如不正确,请指正,相互学习

2013年7月09日 14:46
0 0

START TRANSACTION; 去掉吧

这段代码感觉没必要这么大的锁

2013年7月09日 11:57

相关推荐

    mysql死锁的一些案例

    这篇博客文章《mysql死锁的一些案例》可能深入探讨了MySQL中死锁的产生原因、表现形式以及解决策略。虽然具体内容未给出,但我们可以根据通常的死锁情况来进行分析。 1. **死锁产生的原因**: - 资源请求顺序不同...

    mysql死锁解决

    ### MySQL死锁解决 在数据库管理系统(DBMS)中,特别是在关系型数据库系统如MySQL中,事务处理是确保数据一致性和可靠性的关键机制之一。然而,在并发操作环境下,多个事务可能会因为请求锁定相同的资源而相互等待...

    MYSQL 数据库死锁

    MySQL数据库死锁是数据库系统中常见的问题,它发生在两个或多个事务在执行过程中,因争夺资源而造成的一种相互等待的现象,若无外力干涉它们将无法继续执行。了解和处理死锁是数据库管理员和开发人员必备的技能。...

    mysql innodb死锁问题详解.docx

    MySQL的InnoDB存储引擎在处理并发事务时可能会遇到死锁问题,这主要发生在多个事务互相等待对方释放资源的情况下。死锁通常由四个必要条件引发: 1. 互斥条件:资源只能被一个事务使用。 2. 请求和保持条件:一个...

    mysql死锁以及死锁日志分析1

    MySQL中的死锁问题是一个常见的事务处理挑战,尤其是在并发操作中。死锁发生时,两个或多个事务互相等待对方释放资源,导致系统无法继续执行。在MySQL的InnoDB存储引擎中,死锁检测机制能自动识别并解决这种情况,...

    mysql-一些常见的mysql死锁案例-笔记记录.zip

    总之,理解MySQL死锁的原理、识别死锁的方法以及如何预防和解决死锁,对于提升系统的稳定性和性能至关重要。在实际操作中,应结合业务需求和数据库特性,采取相应的策略来避免死锁的发生。通过深入学习和实践,我们...

    关于MySQL死锁问题的深入分析

    在数据库管理和编程中,死锁是一个常见的问题,它发生在两个或多个事务在同一资源上相互等待对方释放锁时。在MySQL数据库中,尤其是使用InnoDB存储引擎时,死锁问题不容忽视。理解死锁的原理以及如何预防和解决死锁...

    mysql 数据库死锁原因及解决办法

    MySQL数据库死锁是数据库管理系统中常见的一种问题,它发生在两个或更多个事务之间,当它们互相等待对方释放资源,导致所有事务都无法继续执行。死锁的发生通常与资源的竞争和事务的执行顺序有关。 死锁产生的主要...

    MySQL死锁问题分析及解决方法实例详解

    MySQL死锁问题是一种常见的数据库异常状况,特别是在高并发的在线事务处理(OLTP)系统中。死锁发生在两个或多个事务之间,它们彼此等待对方释放资源,导致事务无法继续执行。MySQL中的死锁主要与存储引擎的锁机制...

    一次mysql死锁的排查过程

    本文基于一个真实的MySQL死锁案例,探讨了如何排查和理解死锁的原因,以帮助后端开发者更好地处理这类问题。 **死锁基础** 死锁是指两个或多个事务在执行过程中,因争夺资源而造成的一种相互等待的现象,若无外力...

    数据库中的死锁问题及其解决方案

    数据库死锁问题是数据库管理系统中一种常见的并发控制问题,通常在多个事务并发执行时发生。死锁的发生使得涉及的事务都无法继续执行,从而影响数据库系统的稳定性和数据的可用性。解决死锁问题通常需要从预防、检测...

    一次神奇的MySQL死锁排查记录

    本篇文章将深入探讨一次神奇的MySQL死锁排查记录,通过具体的案例帮助读者理解和解决这类问题。 在描述中提到的背景,我们了解到作者之前对MySQL锁机制有一定的了解,但在处理一个特定的死锁问题时遇到了挑战。问题...

    Ibatis死锁

    - **死锁检测与解除**:数据库系统如MySQL有内置的死锁检测机制,一旦检测到死锁会主动回滚一个事务以解除死锁。 标签 "源码" 和 "工具" 提示我们可能需要深入到Ibatis的源代码中寻找死锁产生的原因,并且可能需要...

    Java中死锁的例子

    在Java编程中,死锁(DeadLock)是一个重要的并发控制问题,它发生在两个或多个线程互相持有对方需要的资源并等待对方释放时,导致所有线程都无法继续执行的情况。死锁是多线程编程中需要特别注意和避免的问题,因为...

    查找MySQL线程中死锁的ID的方法

    在MySQL数据库系统中,...总之,处理MySQL中的死锁问题需要理解事务和锁的工作原理,通过监控线程状态和分析死锁报告来定位问题。通过优化代码和配置参数,可以有效地预防和解决死锁,确保数据库系统的稳定性和性能。

    通过唯一索引S锁与X锁来了解MySQL死锁套路

    了解和掌握S锁与X锁的性质以及它们在唯一索引上的应用,对于解决和预防MySQL中的死锁问题至关重要。通过细心设计事务逻辑、合理使用索引以及对锁的理解,可以有效地降低死锁的发生,从而提高数据库系统的并发性能和...

Global site tag (gtag.js) - Google Analytics