数据库原理

数据库 锁机制及原理

倾然丶 夕夏残阳落幕 提交于 2019-12-06 05:25:17
转自 https://blog.csdn.net/C_J33/article/details/79487941 数据库锁 先看一张图自己整理的数据库锁的树形图 概要 数据库锁一般可以分为两类,一个是悲观锁,一个是乐观锁。 乐观锁一般是指用户自己实现的一种锁机制,假设认为数据一般情况下不会造成冲突,所以在数据进行提交更新的时候,才会正式对数据的冲突与否进行检测,如果发现冲突了,则让返回用户错误的信息,让用户决定如何去做。乐观锁的实现方式一般包括使用版本号和时间戳。 悲观锁一般就是我们通常说的数据库锁机制,以下讨论都是基于悲观锁。 悲观锁主要表锁、行锁、页锁。在MyISAM中只用到表锁,不会有死锁的问题,锁的开销也很小,但是相应的并发能力很差。innodb实现了行级锁和表锁,锁的粒度变小了,并发能力变强,但是相应的锁的开销变大,很有可能出现死锁。同时inodb需要协调这两种锁,算法也变得复杂。InnoDB行锁是通过给索引上的索引项加锁来实现的,只有通过索引条件检索数据,InnoDB才使用行级锁,否则,InnoDB将使用表锁。 表锁和行锁都分为共享锁和排他锁(独占锁),而更新锁是为了解决行锁升级(共享锁升级为独占锁)的死锁问题。 innodb中表锁和行锁一起用,所以为了提高效率才会有意向锁(意向共享锁和意向排他锁)。 为了表锁和行锁而存在的意向锁 官方文档中是这么描述的,

数据库原理-SQL查询语句

烂漫一生 提交于 2019-12-05 17:53:12
参考书籍《Oracle 数据库开发与应用》 SQL查询语句,针对数据库中的表提供了各种查询功能。这里分为五个部分,说明在SQL中如何对数据进行查询。 简单查询 SELCET语句是最简单的SQL语句,格式为 ---------------------------------------- SELECT {*,列名[别名],···} FROM 表名; ----------------------------------------- 在SELECT语句中,具有以下性质:1.包含算术表达式 2.给字段起别名 3.空值在结果中无限大 4.用DISTINCT关键字去掉重复值 *还可以带有限制条件的查询,这也是最常用也非常重要的。 1.WHERE 限制 在WHERE子句中一般是一个字段/公式与一个值的比较,可以使用关系运算符(进行数据过滤)、逻辑运算符(多个条件限制查询) 2.BETWEEN···AND定位范围 3.IN代替OR运算符 4.LIKE模糊查询 5.ORDER BY排序 可以对多个字段排序,支持通过别名排序, 注意ORDER BY子句只能出现在整个SELECT语句最后。 连接查询 分为内连接、外连接和其他连接。 *内连接 ,基本格式为------------------------------------------- SELECT 列名 FROM 表名1 JOIN 表名2 ON

数据库·并发控制原理

北城余情 提交于 2019-12-05 07:50:04
ref: https://blog.csdn.net/whyangwanfu/article/details/1926675 可串行化 事务集并发执行产生的任何调度的执行效果等价于这些事务按某个串行顺序执行的结果。 可串行化可通过并发控制机制( 两阶段封锁协议 )来保证。 冲突可串行化 只考虑read(X)与write(X)操作。 若一个调度S通过一系列非冲突指令交换(交换两条连续的不冲突的指令)与一个串行调度冲突等价,则调度S是冲突可串行化的。 视图可串行化 比冲突可串行化宽松。 可恢复性 可恢复调度 对于每对事务Ti与Tj,Tj读取了Ti写的数据,则Ti先于Tj提交 无级联调度 对于每对事务Ti与Tj,Tj读取了Ti写的数据,则Ti先于Tj的 读取 前提交 级联调度会因一个事务故障导致一系列事务回滚 隔离性的实现 只产生 冲突可串行化或视图可串行化且无级联的调度 可串行化判定 冲突可串行化检测 以事务为顶点,构造有向图,判环 Ti 中的 read(X) 在Tj中的 write(X) 之前 Ti 中的 write(X) 在Tj中的 read(X) 之前 Ti 中的 write(X) 在Tj中的 write(X) 之前 满足以上任意一条则构造一条边,Ti -> Tj 视图可串行化检测 NP完全问题 并发控制 锁的授予 共享锁S,读锁 排他锁X,写锁 Q:如何避免申请排他锁的事务饿死

小小微免单系统开发框架原理

廉价感情. 提交于 2019-12-05 07:36:42
开发语言:PHP 数据库:Mysql 框架:TP5 </style> <script src="/public/chuanke/js/jquery.js"></script> <meta name="Keywords" content=""> <meta name="Description" content=""> <title>会员中心</title> </head> <body style="background: #dfdfdf url(/public/chuanke/img/pag.jpg) repeat center;"> <div class="container-fluid"> <nav class="navbar navbar-default navbar-fixed-bottom"> <div class="row"> <div class="col-xs-3"> <div class="center-common"> <a href="/index.php/chuangke/CkUser/applylevel2.html" style="color:#FFFFFF;font-size:13px;"> <div class="img-common"><img class="banner-img" src="/public/chuanke/img/home.png"

mysql 执行原理

无人久伴 提交于 2019-12-05 02:43:29
1.为什么使用Msyql 开放、免费 2.mysql介绍 关系型数据库管理系统(RDBMS)来存储和管理的大数据量。   所谓的关系型数据库,是建立在关系模型基础上的数据库,借助于集合代数等数学概念和方法 来处理数据库中的数据。 RDBMS即关系数据库管理系统(Relational Database Management System)的特点:   1.数据以表格的形式出现   2.每行为各种记录名称   3.每列为记录名称所对应的数据域   4.许多的行和列组成一张表单   5.若干的表单组成database 注:   保证数据一致性。   关系型数据库,表与表之间存在对应关系。   非关系行数据库,表之间不存在关系,数据独立,随便存。 MYSQL是最流行的关系型数据库管理系统 。 支持大型的数据库。可以处理拥有上千万条记录的大型数据库。 使用标准的SQL数据语言形式。 可以允许于多个系统上,并且支持多种语言。 这些编程语言包括C、C++、Python、Java、Perl、PHP、Eiffel、Ruby和Tcl等。 对PHP有很好的支持,PHP是目前最流行的Web开发语言。 支持大型数据库,支持5000万条记录的数据仓库,32位系统表文件最大可支持4GB, 64位系统支持最大的表文件为8TB。 是可以定制的,采用了GPL协议,你可以修改源码来开发自己的MYSQL系统。 GPL协议

【转】Mysql中事务ACID实现原理

时光怂恿深爱的人放手 提交于 2019-12-04 18:58:32
转自: https://www.cnblogs.com/rjzheng/p/10841031.html 作者:孤独烟 引言 照例,我们先来一个场景~ 面试官:"知道事务的四大特性么?" 你:"懂,ACID嘛,原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)!" 面试官:"你们是用mysql数据库吧,能简单说说innodb中怎么实现这四大特性的么?“ 你:"我只知道隔离性是怎么做的balabala~~" 面试官:"还是回去等通知吧~" OK,回到正题。说到事务的四大特性原子性( Atomicity )、一致性( Consistency )、隔离性( Isolation )、持久性( Durability ),懂的人很多。但是稍微涉及细节一点,这四大特性在数据库中的实现原理是怎么样的?那就没有几个人能够答得上来了。因此,我们这篇文章着重讨论一下四大特性在Mysql中的实现原理。 正文 我们以从A账户转账50元到B账户为例进行说明一下ACID,四大特性。 原子性 根据定义,原子性是指一个事务是一个不可分割的工作单位,其中的操作要么都做,要么都不做。即要么转账成功,要么转账失败,是不存在中间的状态! 如果无法保证原子性会怎么样? OK,就会出现 数据不一致 的情形,A账户减去50元,而B账户增加50元操作失败

小菜鸟之面试题下

社会主义新天地 提交于 2019-12-04 15:31:51
1 1 nio是什么?原理是什么?解决什么问题?如何实现? 2 nio是nonblocked io 非堵塞流 3 核心类有 Channel/Selector/Buffer 4 解决高并发情况下流的阻塞问题 5 6 2.IO/NIO的区别,为什么要用NIO,使用IO中的Buffered..也能实现NIO的面向缓冲,什么情况下用NIO? 7 io面向流/nio面向缓冲的 8 io是阻塞的/nio是非阻塞的 9 io没有选择器/nio有选择器 10 举例: 11 就是将100个客人的需求被登记区记录排序,然后让10个服务员(线程)到登记区(selector)领需求,完成后再返回领 需求,这样效率高 12 文件超大时候,使用nio缓冲区MappedByteBuffer,读写性能高,而且是异步的 13 14 15 3 什么是同步?什么是异步? 16 同步:程序的执行顺序和任务的排列顺序保持一致的,好比排队取餐 17 异步:程序的执行顺序和任务的排序顺序可以不一致,因为每个任务都有一个回调函数, 18 回调函数将原来的任务分担出一些功能,给原来的任务减负,程序执行任务耗时缩短 ,比如ajax技术 19 20 参考 21 22 http://blog.csdn.net/zhouhl_cn/article/details/6568119(比喻介绍IO/NIO的区别) 23 24 https:/

数据库原理(日志系统原理)[转]

被刻印的时光 ゝ 提交于 2019-12-03 21:34:47
ref: https://blog.csdn.net/whyangwanfu/article/details/1926367 事务的原语操作 在事务系统的运行当中,有三个地址空间供元素存储: 磁盘空间 缓冲区 事务的局部地址空间。 一个简单的读、修改X元素操作的流程如:事务到缓冲中读取元素X,如果命中,则读取事务局部地址空间并返回,如果未命中,则先将相关页从磁盘读入缓冲区。事务在它的局部地址空间中修改元素X,然后写入缓冲区,再从缓冲区写入磁盘。当然缓冲区的数据也可能不是立即拷贝入磁盘的,这取决于具体的缓冲区管理策略。 为了便于描述,我们描述了4个操作原语: INPUT(X) :将包含数据库元素X的磁盘块拷贝到内存缓冲区 READ(X,t) :将数据库元素X拷贝到事务的局部变量t。更准确地说,如果包含数据库元素X的块不在内存缓冲区中,则首先执行INPUT(X)。接着将X的值赋给局部变量t。 WRITE(X,t) :将局部变量t的值拷贝到内存缓冲区中的数据库元素X。更准确地说,如果包含数据库元素X的块不在内存缓冲区中,则首先执行INPUT(X)。将着将t的值拷贝到缓冲区中的X。 OUTPUT(X) :将包含X的缓冲区拷贝到回磁盘。 undo日志 如果系统崩溃,恢复管理器就被激活,检查日志以重建数据库的一致性状态。恢复时,有些事务的工作将会重做,它们写到数据库的新值会重写一次

探寻数据库索引的底层原理

穿精又带淫゛_ 提交于 2019-12-03 20:16:26
我们都有到图书馆借书的经历,偌大的图书馆,为什么能在短的时间内找到想要找的书?如果这些书是杂乱无章的堆放,或者没有任何标识的放在书架,那么还能这么快的找到吗?这个场景就很接近我们软件开发中使用数据库的场景,图书馆的书就类似我们数据表中的数据,楼层索引牌、书架分类标识、索书号就类似我们查找数据的索引。那我们常用的数据库的索引底层的一个数据结构是什么样的呢?要了解数据库索引的底层原理,我们就得先了解一种叫树的数据结构,而树中很经典的一种数据结构就是二叉树!所以下面我们就从二叉树到平衡二叉树,再到B-树,最后到B+树来一步一步了解数据库索引底层的原理! 一.二叉树(Binary Search Trees) 二叉树是每个结点最多有两个子树的树结构。通常子树被称作“左子树”(left subtree)和“右子树”(right subtree)。二叉树常被用于实现二叉查找树和二叉堆。二叉树有如下特性: 1、每个结点都包含一个元素以及n个子树,这里0≤n≤2。 2、左子树和右子树是有顺序的,次序不能任意颠倒。左子树的值要小于父结点,右子树的值要大于父结点。   光看概念有点枯燥,假设我们现在有这样一组数[35 27 48 12 29 38 55],顺序的插入到一个数的结构中,步骤如下 好了,这就是一棵二叉树啦!我们能看到,经通过一系列的插入操作之后,原本无序的一组数已经变成一个有序的结构了

oralce数据库的回滚操作原理

╄→гoц情女王★ 提交于 2019-12-03 18:23:26
1 打开分析参数 SQL> set autotrace traceonly statistics 2 创建测试用的表格 SQL> create table t as select * from all_objects where 1=0; 表已创建。 SQL> desc t; 名称 是否为空? 类型 ----------------------------------------- -------- ---------------------------- OWNER NOT NULL VARCHAR2(30) OBJECT_NAME NOT NULL VARCHAR2(30) SUBOBJECT_NAME VARCHAR2(30) OBJECT_ID NOT NULL NUMBER DATA_OBJECT_ID NUMBER OBJECT_TYPE VARCHAR2(19) CREATED NOT NULL DATE LAST_DDL_TIME NOT NULL DATE TIMESTAMP VARCHAR2(19) STATUS VARCHAR2(7) TEMPORARY VARCHAR2(1) GENERATED VARCHAR2(1) SECONDARY VARCHAR2(1) 3 看看表格里的数据 ,首次读取 SQL> select * from t; 未选定行 统计信息