`
ahua186186
  • 浏览: 562000 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

今天面试总结:INSERT并发过大导致锁死表(新数据无法insert)问题解决

 
阅读更多
今天去面试被这个问题问挂啦,只怪数据库知识太弱,准备买本高性能MYSQL补补,多看看沈询的视频。 现总结下如何解决这个问题:

问题分析和思考:

(1)现在数据库的事务隔离级别都是快照级别(MVCC),理论上写写操作是不是不会产生死锁的?
(2)表锁了,查看session,关联出SQL,然后执行看看,基本也可以定位下问题。



1.临时方案1:”查询是否是SQL的问题,查看锁表情况并处理锁表“ 或 “调整MYSQL事务隔离级别” 或 “重建索引表空间 ”或 “查询空间是否足够”

/*
*locked
*query locked object and analyse reason,kill it
*
*/

select 'alter system kill session ''' || SID || ',' || SERIAL# || ''';'
  from (select distinct a.sid,
                        a.Serial#,
                        status,
                        machine,
                        LOCKWAIT,
                        logon_time
          from v$session a, v$locked_object b
         where (a.status = 'ACTIVE' or a.status = 'INACTIVE')
           and a.sid = b.session_id
           and b.ORACLE_USERNAME = 'XYHISTEST' --加上用户名可过滤用户资源
        )
       
/*2、批量执行第一步生成的语句
alter system kill session 'sid,serial#';
alter system kill session '6976,33967';*/   

/*3、查询oracle用户名,机器名,锁表对象*/
SELECT l.session_id sid,
       s.serial#,
       l.locked_mode,
       l.oracle_username,
       l.os_user_name,
       s.machine,
       s.terminal,
       o.object_name,
       s.logon_time
  FROM v$locked_object l, all_objects o, v$session s
 WHERE l.object_id = o.object_id
   AND l.session_id = s.sid
 ORDER BY sid, s.serial#;

/*3.或者*/
select s.SID, s.OSUSER, p.spid as OSPID, s.MACHINE, s.TERMINAL, s.PROGRAM
  from v$session s, v$process p
 where s.sid = 6 --session_id
   and s.paddr = p.addr;

/*4、查询是执行何sql语句导致锁表的*/
select b.sql_text
  from v$session a, v$sql b
 where a.sid = 6 --session_id
   and a.SQL_ADDRESS = b.ADDRESS(+);

/*5、查询是执行何sql语句导致锁表的*/
SELECT l.session_id sid,
       s.serial#,
       l.locked_mode,
       l.oracle_username,
       s.user#,
       l.os_user_name,
       s.machine,
       s.terminal,
       a.sql_text,
       a.action
  FROM v$sqlarea a, v$session s, v$locked_object l
 WHERE l.session_id = s.sid
   AND s.prev_sql_addr = a.address
 ORDER BY sid, s.serial#;




2.临时方案2:流量控制(本质就是计数和统计 + 配置限制),和写入频率控制:

(1)可以在接入层,应用层,服务层,数据访问层控制流量,
(2)也可以用消息队列异步控制写入数据到数据库的速度,或者RPC工具缓存数据到队列,控制写入到数据库的频率。

3.长期方案:根据实际业务做好数据切分,也就是分表,这个也是最复杂的。
分享到:
评论

相关推荐

    sqlserver表数据生成insertsql脚本(导出成insertsql脚本).pdf

    SQL Server表数据生成INSERT SQL脚本 SQL Server是一种强大的关系数据库管理系统,提供了多种方式来生成INSERT SQL脚本,以便将数据导出到其他数据库或系统中。在本文中,我们将介绍如何使用SQL Server 2008中文版...

    Sqlserver大数据量插入速度慢或丢失数据的解决方法

    ### Sqlserver大数据量插入速度慢或丢失数据的解决方法 #### 概述 在处理大量数据插入SQL Server数据库的过程中,可能会遇到插入速度慢或者数据丢失的问题。这种情况通常出现在需要批量插入数千甚至上万条记录的...

    将sqlserver表中指定数据转化为insert语句

    在SQL Server中,有时我们需要将现有表中的特定数据导出为INSERT语句,以便在其他数据库或备份中重建这些记录。这通常在迁移数据、创建测试数据或者进行数据备份时非常有用。以下是如何将SQL Server表中指定数据转化...

    生成数据库表insert语句脚本

    INSERT语句是SQL语言的一部分,用于向数据库表中插入新的数据记录。以下将详细介绍如何生成这些脚本以及其在实际操作中的应用。 1. **什么是INSERT语句**: INSERT语句用于在数据库表中插入新的行。基本语法如下:...

    c# 导出MSSQL表数据 Insert语句

    本文将深入探讨如何在C#中导出MSSQL表的数据并生成Insert语句,这对于数据迁移、备份或测试环境的搭建都非常有用。 首先,要实现这个功能,我们需要对SQL Server的ADO.NET库有基本的了解。ADO.NET是微软提供的一个...

    SQL Server表数据导出成Insert语句的工具

    5. **效率与优化**:高效的工具会考虑大数据量的处理,例如分批生成Insert语句,以避免单个语句过长导致的问题。同时,它们可能提供选项来控制数据的排序,以便于数据的逻辑一致性。 6. **安全性和兼容性**:确保...

    VB 利用INSERT语句向数据表中插入数据

    在VB(Visual Basic)编程中,向数据表中插入数据是一项基本操作,通常涉及与数据库的交互。在本教程中,我们将深入探讨如何利用INSERT语句来实现这一目标。INSERT语句是SQL语言的一部分,用于在数据库表中创建新的...

    mysql insert锁机制1

    MySQL的Insert锁机制是数据库管理系统中确保数据一致性和并发控制的重要组成部分。在MySQL的InnoDB存储引擎中,插入操作不仅涉及到行级锁,还可能涉及Gap锁和Next-Key Locks,这些锁机制的设计是为了防止幻读...

    SQL SERVER:把表里的数据导出成为INSERT INTO脚本的存储过程

    根据提供的文件信息,我们可以构建一个详细的SQL Server存储过程来实现将表中的数据转换为`INSERT INTO`脚本的功能。此存储过程将适用于多种数据类型,并能够动态生成插入语句,以便用户可以方便地导出数据作为脚本...

    php_redis并发insert

    由于Redis的`RPOP/LPOP`(右/左出队)操作是原子性的,这意味着即使有多个客户端同时尝试从队列中取出数据,它们也会按照FIFO(先进先出)的顺序依次执行,避免了并发问题。 此外,“pop操作是原子的”这一特点使得...

    将表中数据导出为insert sql 语句

    根据给定的文件信息,我们将深入探讨如何将数据库表中的数据导出为SQL INSERT语句。这种方法在数据迁移、备份或需要将数据插入到另一个数据库的场景中非常有用。下面,我们将详细介绍这一过程的关键步骤和技术细节。...

    40insert语句的锁为什么这么多?.pptx

    因此,为了防止并发问题,如幻读(phantom reads),`insert…select`会在扫描源表时对所有将要插入的行及其前导间隙加锁,这可能导致其他事务等待,例如事务B的`insert into t values(-1,-1,-1)`可能会被阻塞。...

    数据库表数据转为insert sql语句

    Data row to insert sql是一个小的工具软件,可以将数据库表中指定数据转换成相应的insert sql语句。目前支持的数据库类型为oracle,db2,ms sql server。 目前还有一些缺陷,还有待完善,具体如下: 1、对ms sql ...

    Sqlserver表数据导出成Insert语句的工具

    此工具可以将SQL Server表数据导出成Insert语句。SQL Server的导入导出功能可以导出创建数据库各对象的脚本,却不提供导出目标表的现有数据为Insert语句的功能,此工具可以将SQL Server表数据导出成Insert语句。

    数据库表导出insert语句工具

    在IT行业中,数据库管理是至关重要的任务之一,而“数据库表导出insert语句工具”是一种实用的数据库管理辅助工具,特别适用于数据迁移、备份或测试环境的数据填充。本文将详细探讨这种工具及其与MySQL数据库的关系...

    SQL数据导出insert语句工具

    4. 大数据处理:对于大数据量,可能需要考虑分批插入,以防止一次性操作导致的内存溢出或锁表问题。 5. 版本兼容性:确保生成的INSERT语句与目标数据库的SQL版本兼容,因为不同的SQL版本可能对语句有特定的限制或...

    模板名称:[Insert template name] 模板描述:[Insert template description]

    模板名称:[Insert template name] 模板描述:[Insert template description] 模板内容: 1. 概述 [Insert overview text] 2. 需求分析 [Insert requirement analysis text] 3. 概念设计 [Insert conceptual ...

    Oracle导出INSERT语句

    INSERT语句是SQL语言的基本组成部分,用于向数据库表中插入新的数据记录。通过生成这些语句,我们可以方便地在目标环境中重新创建源数据库中的数据状态,而无需进行完整数据库的导入导出操作,这对于测试环境或数据...

Global site tag (gtag.js) - Google Analytics