今天面试总结:INSERT并发过大导致锁表问题解决

标签: 面试 insert 并发 | 发表时间:2015-08-01 16:41 | 作者:ahua186186
出处:http://www.iteye.com
今天去面试被这个问题问挂啦,一开始真没听懂他说的啥,本来想用分表分库这种高大上的东西忽悠一下,后来还是说不知道就走人, 现总结下如何解决这个问题:

1.临时方案1:查看锁表情况并处理锁表

/*
*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.长期方案:根据实际业务做好数据切分,也就是分表,这个也是最复杂的。

已有 0 人发表留言,猛击->> 这里<<-参与讨论


ITeye推荐



相关 [面试 insert 并发] 推荐:

今天面试总结:INSERT并发过大导致锁表问题解决

- - 数据库 - ITeye博客
今天去面试被这个问题问挂啦,一开始真没听懂他说的啥,本来想用分表分库这种高大上的东西忽悠一下,后来还是说不知道就走人, 现总结下如何解决这个问题:. 1.临时方案1:查看锁表情况并处理锁表. /* *locked *query locked object and analyse reason,kill it * */ select 'alter system kill session ''' || SID || ',' || SERIAL# || ''';' from (select distinct a.sid,.

MySQL insert性能优化

- - Rebill's Blog
对于一些数据量较大的系统,面临的问题除了是查询效率低下,还有一个很重要的问题就是插入时间长. 我们就有一个业务系统,每天的数据导入需要4-5个钟. 这种费时的操作其实是很有风险的,假设程序出了问题,想重跑操作那是一件痛苦的事情. 因此,提高大数据量系统的MySQL insert效率是很有必要的. 经过对MySQL的测试,发现一些可以提高insert效率的方法,供大家参考参考.

Oracle中Merge Into 代替Insert/Update的应用

- - 数据库 - ITeye博客
在进行SQL语句编写时,我们经常会遇到大量的同时进行Insert/Update的语句 ,也就是说当存在记录时,就更新(Update),不存在数据时,就插入(Insert). 在一个同时存在Insert和Update语法的Merge语句中,总共Insert/Update的记录数,就是Using语句中的记录数.

hibernate insert 时 无主键使用复合主键

- -
复合主键,由多个字段组成主键,例如,使用一个用户的firstname和lastname组成主键. 可以通过两种方式确定主键,一种是基于实体类的复合主键,另一种是通过定义主键类来实现. 不管通过哪种方式,复合主键都需要实现equals方法和hashcode方法,以作为不同数据之间是别的标志. 一.基于实体类属性的复合主键.

使用事务提升sqlite insert的性能

- - CSDN博客移动开发推荐文章
昨天发现sqlite插入性能很低,搜索了一下发现,其实sqlite的插入可以做到每秒50000条,但是处理事务的速度慢:. A transaction normally requires two complete rotations of the disk platter, which on a 7200RPM disk drive limits you to about 60 transactions per second.

新鲜出炉,PCIE卡SQLServer和SSD Mongodb集群4千万数据insert测试

- - snoopyxdy的博客
最近公司需要测试1亿条数据10分钟插入数据库,主要是为了数据推送留存用. 最终我们讨论给出了2套方案. 1、单台sqlserver 配合PCIE卡. 2、Mongodb分片集群. 因为目前数据量是4千万,所以我分别对4千万数据和1亿数据进行了写入测试. 被测试机器都是24CPU,64G内存的独立服务器.

JAVA多线程和并发基础面试问答

- - 企业架构 - ITeye博客
原文链接    译文连接  作者:Pankaj   译者: 郑旭东   校对:方腾飞. 多线程和并发问题是Java技术面试中面试官比较喜欢问的问题之一. 在这里,从面试的角度列出了大部分重要的问题,但是你仍然应该牢固的掌握Java多线程基础知识来对应日后碰到的问题. ( 校对注:非常赞同这个观点).

高并发面试必问:分布式消息系统Kafka简介

- - ITeye博客
Kafka是分布式发布-订阅消息系统. 它最初由LinkedIn公司开发,之后成为Apache项目的一部分. Kafka是一个分布式的,可划分的,冗余备份的持久性的日志服务. 在大数据系统中,常常会碰到一个问题,整个大数据是由各个子系统组成,数据需要在各个子系统中高性能,低延迟的不停流转. 传统的企业消息系统并不是非常适合大规模的数据处理.

变态面试

- Tony - 叫兽与你同在