数据库死锁

SQLite入门与分析(五)---Page Cache之并发控制

对着背影说爱祢 提交于 2019-12-29 03:02:33
写在前面:本节主要谈谈SQLite的锁机制,SQLite是基于锁来实现并发控制的,所以本节的内容实际上是属于事务处理的,但是SQLite的锁机制实现非常的简单而巧妙,所以在这里单独讨论一下。如果真正理解了它,对整个事务的实现也就理解了。而要真正理解SQLite的锁机制,最好方法就是阅读SQLite的源码,所以在阅读本文时,最好能结合源码。SQLite的锁机制很巧妙,尽管在本节中的源码中,我写了很多注释,也是我个人在研究时的一点心得,但是我发现仅仅用言语,似乎不能把问题说清楚,只有通过体会,才能真正理解SQLite的锁机制。好了,下面进入正题。 SQLite的并发控制机制是采用加锁的方式,实现非常简单,但也非常的巧妙,本节将对其进行一个详细的解剖。 请仔细阅读下图,它可以帮助更好的理解下面的内容。 1、RESERVED LOCK RESERVED锁意味着进程将要对数据库进行写操作。某一时刻只能有一个RESERVED Lock,但是RESERVED锁和SHARED锁可以共存,而且可以对数据库加新的SHARED锁。 为什么要用RESERVED锁? 主要是出于并发性的考虑。 由于SQLite只有库级排斥锁(EXCLUSIVE LOCK),如果写事务一开始就上EXCLUSIVE锁,然后再进行实际的数据更新,写磁盘操作,这会使得并发性大大降低。而SQLite一旦得到数据库的RESERVED锁

操作系统知识体系复习总结总结

纵然是瞬间 提交于 2019-12-28 21:23:23
说明:本篇只为复习大纲,并未详细说明。 第一章 操作系统引论 统的目标:有效性(提高资源利用率和系统吞吐量)、方便性、可扩充性、开放性。 有效性 和 方便性 是操作系统最重要两个目标。 操作系统的作用: (1) OS作为用户与计算机硬件系统之间的接口 (2) OS作为计算机系统资源的管理者(处理器、存储器、I/O设备、数据程序) (3) OS实现了对计算机资源的抽象(在硬件上覆盖I/O设备、文件和窗口管理软件,即虚拟机) OS的发展过程:无操作系统的计算机系统→单道批处理系统→多道批处理系统→分时系统→实时系统→微机操作系统 操作系统的基本特征: (1) 并发性(两个或多个事件在 同一时间间隔内 发生;进入进程和线程) (2) 共享性(系统中资源可供内存中多个并发执行的进程(线程)共同使用, 方式为互斥共享方式和同时访问方式 ) (3) 虚拟性(通过某种技术把一个物理实体变为若干个逻辑上的对应物。方式: 时分复用技术和空分复用技术 ) (4) 异步性(进程以不可预知的速度向前推进,多道程序设计固有的特点) OS的主要功能: (1) 处理机管理(进程管理)功能;(主要包括创建和撤销进程、协调诸进程的运行、实现进程间信息交换、把处理机分配给进程。进程同步机制功能是协调多个进程的运行, 分为竞争和协作两种方式 ,实现进程同步常用的及时是 信号量机制 。调度包括 作业调度和进程调度 两步。

Sql Server 高频,高并发访问中的键查找死锁解析

*爱你&永不变心* 提交于 2019-12-27 03:04:43
死锁对于DBA或是数据库开发人员而言并不陌生,它的引发多种多样,一般而言,数据库应用的开发者在设计时都会有一定的考量进而尽量避免死锁的产生.但有时因为一些特殊应用场景如高频查询,高并发查询下由于数据库设计的潜在问题,一些不易捕捉的死锁可能出现从而影响业务.这里为大家介绍由于设计问题引起的键查找死锁及相关的解决办法. 这里我们在测试的同时开启trace profiler跟踪死锁视图(locks:deadlock graph).(当然也可以开启跟踪标记,或者应用扩展事件(xevents)等捕捉死锁) 创建测试对象code create table testklup ( clskey int not null, nlskey int not null, cont1 int not null, cont2 char(3000) ) create unique clustered index inx_cls on testklup(clskey) create unique nonclustered index inx_nlcs on testklup(nlskey) include(cont1) insert into testklup select 1,1,100,'aaa' insert into testklup select 2,2,200,'bbb' insert into

软开面试题合集--Binrry(冰蕊)

醉酒当歌 提交于 2019-12-24 13:39:27
线程和进程的区别 根本区别:进程是操作系统资源分配的基本单位,而线程是任务调度和执行的基本单位 在开销方面:每个进程都有独立的代码和数据空间(程序上下文),程序之间的切换会有较大的开销;线程可以看做轻量级的进程,同一类线程共享代码和数据空间,每个线程都有自己独立的运行栈和程序计数器(PC),线程之间切换的开销小。 所处环境:在操作系统中能同时运行多个进程(程序);而在同一个进程(程序)中有多个线程同时执行(通过CPU调度,在每个时间片中只有一个线程执行) 内存分配方面:系统在运行的时候会为每个进程分配不同的内存空间;而对线程而言,除了CPU外,系统不会为线程分配内存(线程所使用的资源来自其所属进程的资源),线程组之间只能共享资源。 包含关系:没有线程的进程可以看做是单线程的,如果一个进程内有多个线程,则执行过程不是一条线的,而是多条线(线程)共同完成的;线程是进程的一部分,所以线程也被称为轻权进程或者轻量级进程。 垃圾收集讲一下,1.8有哪些新特性 深入理解JVM垃圾收集机制(JDK1.8) JDK1.8 十大新特性详解 jvm调优有哪些参数 深入理解JVM-内存模型(jmm)和GC 深入详解JVM内存模型与JVM参数详细配置 tcp和udp,tcp网络架构 TCP与UDP的对比 TCP/IP架构 TCP/IP五层网络架构及OSI参考模型 nio与bio

最简单的死锁处理

自闭症网瘾萝莉.ら 提交于 2019-12-23 21:42:21
最简单的死锁处理,有时系统出现数据库死锁情况时, --查询死锁 SELECT request_session_id spid,OBJECT_NAME (resource_associated_entity_id)AUDIT_PROJECT FROM sys.dm_tran_locks WHERE resource_type='OBJECT'; --结束死锁 kill 18; 其中,结束死锁的kill 后面的数字,是查询语句的第一个字段,这取名 spid, 查询出来可能是多个,多次执行kill语句,直到查询语句查不出来结果,简单粗暴~ 当然,解决死锁根本的方法,是优化代码,不要造成死锁,当然要先了解下死锁的原理和原因:   死锁是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程, 死锁产生条件: 虽然进程在运行过程中,可能发生死锁,但死锁的发生也必须具备一定的条件,死锁的发生必须具备以下四个 必要条件 。 [2] 1)互斥条件:指进程对所分配到的资源进行排它性使用,即在一段时间内某资源只由一个进程占用。如果此时还有其它进程请求资源,则请求者只能等待,直至占有资源的进程用毕释放。 2)请求和保持条件:指进程已经保持至少一个资源

MySQL锁技术详解

隐身守侯 提交于 2019-12-23 18:11:56
Mysql锁技术详解 本文只讨论InoDB存储引擎下的锁。 前言 在分布式并发的场景下,对于共享资源的操作是非原子性的,这会造成操作和预期的结果并不一致。 原子性操作 :指在一次CPU的调度时间类完成的一系列操作,顺序不可打乱,也不可只执行一部分。 任何可能能被CPU打断的操作都不是原子操作,所以真正的原子操作需要硬件支持,但是硬件大多数只支持系统的核心方法的原子操作,所以如果想要在自己开发的程序里做原子操作,需要引入锁。在线程A操作共享资源时需要拿到锁,这样即便线程A的操作中途CPU切换到了线程B,线程B想要读取共享资源时缺拿不到锁,所以线程B无法操作共享资源,这样就模拟出了原子操作,保证了线程A的逻辑是完整正确的。 MySQL的事务具有原子性,所以MySQL肯定实现了许多锁来保证原子操作。以InoDB为例,来看看MySQL实现了哪些锁,这些锁又分别有什么作用。 根据锁的范围来分类,大致分为了三类锁: 全局锁 表锁 行锁 全局锁 顾名思义,全局锁就是对整个数据库实例都加上锁,命令行是 Flush tables with read lock,一旦数据库加上此锁,除了当前操作线程之外,其他的线程对数据库的增删改操作都会被阻塞,包括建表,修改表结构事务更新等操作。 全局锁一般用于数据备份,为了保证备份的一致性,加上全局锁确保备份时间类数据库里的数据不会有更新。

MySQL死锁

旧巷老猫 提交于 2019-12-19 13:08:06
https://dev.mysql.com/doc/refman/5.7/en/innodb-deadlocks.html 什么是mysql的死锁? A deadlock is a situation where different transactions are unable to proceed because each holds a lock that the other needs. Because both transactions are waiting for a resource to become available, neither ever release the locks it holds. 简单来说可以提炼出2个词:环路等待( each holds a lock that the other needs )和不可剥夺( neither ever release the locks it holds )。 其实广泛意义上死锁的四个必要条件也可以直接简化为上述两个条件,剩下的互斥和请求保持条件只是两个众所周知的补充。 一、一个简单的死锁示例: 会话A: mysql> CREATE TABLE t (i INT) ENGINE = InnoDB; Query OK, 0 rows affected (1.07 sec) mysql> INSERT INTO

数据库死锁及解决方法

无人久伴 提交于 2019-12-19 05:06:04
目前,我们已经探讨了许多关于数据库锁的问题,锁能够有效地解决并发的问题,但这也带来了一个严重的缺点,那就是死锁。 死锁在操作系统中指的是两个或两个以上的进程在执行的过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或者系统产生了死锁,这些永远在互相等待的进程称为死锁进程。 在操作系统中,死锁的处理是一个重要的话题,也已经有较为成熟的解决方法,如银行家算法等,在这边我们就不再阐述,只讨论数据库中的死锁。 数据库中常见的死锁原因与解决方案有: 1. 事务之间对资源访问顺序的交替 出现原因: 一个用户A 访问表A(锁住了表A),然后又访问表B;另一个用户B 访问表B(锁住了表B),然后企图访问表A;这时用户A由于用户B已经锁住表B,它必须等待用户B释放表B才能继续,同样用户B要等用户A释放表A才能继续,这就死锁就产生了。 解决方法: 这种死锁比较常见,是由于程序的BUG产生的,除了调整的程序的逻辑没有其它的办法。仔细分析程序的逻辑,对于数据库的多表操作时,尽量按照相同的顺序进行处理,尽量避免同时锁定两个资源,如操作A和B两张表时,总是按先A后B的顺序处理, 必须同时锁定两个资源时,要保证在任何时刻都应该按照相同的顺序来锁定资源 2. 并发修改同一记录 出现原因:主要是由于没有一次性申请够权限的锁导致的。参考: 记录一次死锁排查过程

informix 数据库锁表分析和解决方法

人盡茶涼 提交于 2019-12-19 01:57:00
在联机事务处理(OLTP)的数据库应用系统中,多用户、多任务的并发性是系统最重要的技术指标之一。为了提高并发性,目前大部分RDBMS都采用加锁技术。然而由于现实环境的复杂性,使用加锁技术又不可避免地产生了死锁问题。因此如何合理有效地使用加锁技术,最小化死锁是开发联机事务处理系统的关键。 死锁产生的原因 在联机事务处理系统中,造成死机主要有两方面原因。一方面,由于多用户、多任务的并发性和事务的完整性要求,当多个事务处理对多个资源同时访问时,若双方已锁定一部分资源但也都需要对方已锁定的资源时,无法在有限的时间内完全获得所需的资源,就会处于无限的等待状态,从而造成其对资源需求的死锁。 另一方面,数据库本身加锁机制的实现方法不同,各数据库系统也会产生其特殊的死锁情况。如在Sybase SQL Server 11中,最小锁为2K一页的加锁方法,而非行级锁。如果某张表的记录数少且记录的长度较短(即记录密度高,如应用系统中的系统配置表或系统参数表就属于此类表),被访问的频率高,就容易在该页上产生死锁。 容易发生死锁的几种情况如下: 1>不同的存储过程、触发器、动态SQL语句段按照不同的顺序同时访问多张表; 2>在交换期间添加记录频繁的表,但在该表上使用了非群集索引(non-clustered); 3>表中的记录少,且单条记录较短,被访问的频率较高; 4>整张表被访问的频率高(如代码对照表的查询等

2020年Java面试100题

别来无恙 提交于 2019-12-19 01:54:10
一、Java 基础 1. JDK 和 JRE 有什么区别? JDK:Java Development Kit 的简称,java 开发工具包,提供了 java 的开发环境和运行环境。 JRE:Java Runtime Environment 的简称,java 运行环境,为 java 的运行提供了所需环境。 具体来说 JDK 其实包含了 JRE,同时还包含了编译 java 源码的编译器 javac,还包含了很多 java 程序调试和分析的工具。简单来说:如果你需要运行 java 程序,只需安装 JRE 就可以了,如果你需要编写 java 程序,需要安装 JDK。 2. == 和 equals 的区别是什么? == 解读 对于基本类型和引用类型 == 的作用效果是不同的,如下所示: 基本类型:比较的是值是否相同; 引用类型:比较的是引用是否相同; 代码示例: String x = "string"; String y = "string"; String z = new String("string"); System.out.println(x==y); // true System.out.println(x==z); // false System.out.println(x.equals(y)); // true System.out.println(x.equals(z));