gap

myql的锁

早过忘川 提交于 2019-12-06 08:20:48
本文主要涉及以下几个个部分: 1. 为什么要加锁 2. 锁的分类 3. 常见语句的加锁分析 4. 如何分析死锁 5. 如何预防死锁 先列出本地的运行环境 数据库版本是5.7,隔离级别是Repeatable-Read(可重复读),不同的数据库版本和隔离级别对语句的执行结果影响很大。所以需要说明版本和隔离级别 一、为什么要加锁 数据库是一个多用户使用的共享资源。当多个用户并发地存取数据时,在数据库中加锁是为了保证数据库的一致性。 数据库有ACID原则,其中I是隔离性, 脏读:读未提交的数据 不可重复读:读已修改的数据 虚读:读提交了插入/删除的数据 事务隔离机制 和标准SQL规范相比,MySQL中可重复读解决了幻读,实现了串行化隔离级别的功能,同时没有严重影响并发。是通过加锁、阻止插入新数据,来解决幻读的。 二、锁的分类 锁 我们听说过读锁、写锁、共享锁、互斥锁、行锁等等各种名词,简单对这些锁进行了分类。 锁的分类 加锁机制: 1、乐观锁:先修改,保存时判断是够被更新过,应用级别 2、悲观锁:先获取锁,再操作修改,数据库级别 锁粒度: 表级锁:开销小,加锁快,粒度大,锁冲突概率大,并发度低,适用于读多写少的情况。 页级锁:BDB存储引擎 行级锁:Innodb存储引擎,默认选项 兼容性: S锁,也叫做读锁、共享锁,对应于我们常用的 select * from users where id

搜索与排序

◇◆丶佛笑我妖孽 提交于 2019-12-05 07:17:14
搜索 一、顺序查找 def search(num_list, val): # If empty if num_list == None: return -1 for i in range(0, len(num_list)): if (num_list[i] == val): return i return -1 二、折半查找(二分查找) (1)递归 def bi_search_re(num_list, val): def bi_search(l, h): # Not found if l > h: return -1 # Check mid mid = (l + h) // 2 if (num_list[mid] == val): return mid; elif (num_list[mid] < val): return bi_search(mid + 1, h) else: return bi_search(l, mid - 1) return bi_search(0, len(num_list)) (2)迭代 def bi_search_iter(alist, item): left, right = 0, len(alist) - 1 while left <= right: mid = (left + right) // 2##注意此处建议写为 mid = left +

希尔排序

橙三吉。 提交于 2019-12-04 13:47:39
一.思想 希尔排序是一种分组插入排序算法。 首先取一个整数d1=n/2,将元素分为d1个为一组,每组相邻量元素之间距离为d1,两组数据一一进行对比按大小,从新分配两组 如[1,3,0,2] 第一次排序后变成 [0,2,1,3] 取第二个整数d2=d1/2,重复上述分组排序过程,直到di=1,即所有元素在同一组内进行直接插入排序。 按上面那个简单例子走第二次排序为 [0,2,1,3] 按间隔1进行对比第一次然后依次变成 0与2比,0比2小顺序不变 [0,2,1,3] 2与1比,1比2小1去前面 [0,1,2,3] 依次类推...全部走完就是排好了 [0,1,2,3] 二.代码 这是网上找的精简后的代码,我自己撸的和屎一样很乱 def shell_sort(li): gap = len(li)//2 while gap>0: for i in range(gap,len(li)): tmp =li[i] j = i - gap while j >=0 and tmp <li[j]: li[j+gap]=li[j] j -=gap li[j+gap]=tmp gap /= 2 来源: https://www.cnblogs.com/pythonywy/p/11869000.html

常用函数

天大地大妈咪最大 提交于 2019-12-04 12:05:56
/*binsearch函数:在v[0]<=v[1]<=v[2]<=...<=v[n-1]中查找x*/ int binsearch(int x,int v[], int n) { int low, high, mid; low = 0; high = n-1; while(low <= high) { mid = (low + high)/2; if(x < v[mid]) high = mid -1; else if(x > v[mid]) low = mid +1; else /*找到了匹配值*/ return mid; } return -1; /*没有匹配值*/ } 该函数的基本判断是:在每一步判断x小于、大于还是等于中间元素v[mid]。 /*shellsort函数:按递增顺序对v[0]...v[n-1]进行排序*/ void shellsort(int v[], int n) { int gap, i, j, temp; for(gap=n/2;gap>0;gap/=2) for(i=gap;i<n;i++) for(j=i-gap;j>=0&&v[j]>v[j+gap];j-=gap) { temp=v[j]; v[j]=v[j+gap]; v[j+gap]=temp; } } 该函数中包含一个三重嵌套的for循环语句。最外层的for语句控制两个被比较元素之间的距离

排序

时光怂恿深爱的人放手 提交于 2019-12-04 04:37:28
1、冒泡 function bubb(arr,isDesc){ var len = arr.length; for(var i=0;i<len;i++){ for(var j=i+1;j<len;j++){ if(arr[i] > arr[j]){ var temp = arr[i]; arr[i] = arr[j]; arr[j] = temp; } } } return arr; } 2、插入排序(当数据有序层度越高时,效率越高)数据量不宜太大 // 插入排序分为 已排序区,和为排序区 function insert(arr){ var len = arr.length; if(len == 1){ return arr; }else{ for(var i=1;i<len;i++){ var temp = arr[i]; for(var j=i-1;j>=0;j--){ if( temp < arr[j]){ arr[j + 1] = arr[j]; }else{ break; } } arr[j + 1] = temp;//最后插入时,临界位置 } } } 3、希尔排序 // 希尔排序 ,在插入排序上将大数据进行分组,对每个分组进行插入排序; function shell(arr){ var len = arr.length, gap = len;// 增量

【排序算法】(8)希尔排序

笑着哭i 提交于 2019-12-04 04:15:19
希尔排序 2019-11-10 11:44:39 by冲冲 1、概念 希尔排序(shell排序),是插入排序(直接插入)的增强版。 特点是,在不断缩小增量的过程中,不断地排序,使得在最终使用插入排序时,序列已经基本有序。插入排序在操作基本有序的序列时效率倍增。 2、基本思想 把序列按步长gap分组,对每组小序列采用直接插入排序方法进行排序。 随着步长逐渐减小,所分成的组包含的记录越来越多,当步长的值减小到1时,整个数据合成为一组,构成一组基本有序的序列,进行最后一趟插入排序,完成排序。 例析, 初始时,有一个大小为 10 的无序序列。 在第一趟排序中,设置 gap1 = N / 2 = 5,即相隔距离为 5 的元素组成一组,可以分为 5 组。然后使用直接插入排序的方法对每个组进行排序。 在第二趟排序中,设置 gap2 = gap1 / 2 = 2 (取整数)。即每相隔距离为 2 的元素组成一组,可以分为 2 组。然后使用直接插入排序的方法对每个组进行排序。 在第三趟排序中,设置gap3 = gap2 / 2 = 1。 即相隔距离为 1 的元素组成一组,即只有一组。然后使用直接插入排序的方法对每个组进行排序。此时,排序已经结束。 希尔排序是不稳定性排序:图中有两个相等数值的元素 5 和 5,在排序过程中,两个元素位置交换了。 3、完整代码 1 public class

关于八大基本排序方法的总结(c++版)

拥有回忆 提交于 2019-12-03 11:43:02
#include <iostream> #include <ctime> using namespace std; /*** * 排序算法的总结: * 排序分为稳定排序和不稳定排序 * 稳定排序:相同的值的位置在排序过程中不会发生改变 * 非稳定排序:相同的值的相对位置也许会在算法结束时产生变动 * 1、冒泡排序:什么叫冒泡排序?O(n^2) * 主要的思想就是:1>、每次比较相邻的元素,如果前者大于后者就将它们的值进行交换 * 依次循环n-1次就行--->因为每次循环都把最大的元素放在了最后面,n-1次后最前面的元素自然是最小的了 * 下面是主要的逻辑代码: * for(int i=0;i<9;++i) { for(int j=0;j<9;++j) { if(arr[j]>arr[j+1]) swap(arr[j],arr[j+1]); } } *2、接下来介绍的就是选择排序法: × 应用范围:适合于小规模的排序算法中,因为它的时间复杂度为n^2,每次都要循环遍历一遍数组才能确定一个值,如果有n个值每个数都要进行n次循环,从而算法的时间复杂度为n*n=n^2 *何为选择排序法呢?------>所谓的选择就是从第n个元素开始 * 每次从n后的数组中找到一个最小或者最大的元素与第n个元素进行交换 * 从而可以确保最前面的元素一定是最小的元素,依次往后增加 * 下面是主要的逻辑代码:

insert into加锁分析

匿名 (未验证) 提交于 2019-12-03 00:20:01
在插入之前,会先在插入记录所在的间隙加上一个插入意向gap锁 成功插入后, insert会对插入成功的行加上排它锁 关于意向gap锁: 在insert操作之前,还会加一种锁,官方文档称它为insertion intention gap lock,也就是意向的gap锁。这个意向gap锁的作用就是预示着当多事务并发插入相同的gap空隙时,只要插入的记录不是gap间隙中的相同位置,则无需等待其他session就可完成,这样就使得insert操作无须加真正的gap lock。 假设有一个记录索引包含键值4和7,不同的事务分别插入5和6,每个事务都会产生一个加在4-7之间的插入意向锁,获取在插入行上的排它锁,但是不会被互相锁住,因为数据行并不冲突。 假设发生了一个唯一键冲突错误,那么将会在重复的索引记录上加读锁。当有多个session同时插入相同的行记录时,如果另外一个session已经获得该行的排它锁,那么将会导致死锁(解释: 发生重复唯一键冲突,各自请求的排他记录锁(LOCK_X | LOCK_REC_NOT_GAP)转成共享记录锁(LOCK_S | LOCK_REC_NOT_GAP)。 ) 文章来源: insert into加锁分析

insert into加锁分析

匿名 (未验证) 提交于 2019-12-03 00:19:01
在插入之前,会先在插入记录所在的间隙加上一个插入意向gap锁 成功插入后, insert会对插入成功的行加上排它锁 关于意向gap锁: 在insert操作之前,还会加一种锁,官方文档称它为insertion intention gap lock,也就是意向的gap锁。这个意向gap锁的作用就是预示着当多事务并发插入相同的gap空隙时,只要插入的记录不是gap间隙中的相同位置,则无需等待其他session就可完成,这样就使得insert操作无须加真正的gap lock。 假设有一个记录索引包含键值4和7,不同的事务分别插入5和6,每个事务都会产生一个加在4-7之间的插入意向锁,获取在插入行上的排它锁,但是不会被互相锁住,因为数据行并不冲突。 假设发生了一个唯一键冲突错误,那么将会在重复的索引记录上加读锁。当有多个session同时插入相同的行记录时,如果另外一个session已经获得该行的排它锁,那么将会导致死锁(解释: 发生重复唯一键冲突,各自请求的排他记录锁(LOCK_X | LOCK_REC_NOT_GAP)转成共享记录锁(LOCK_S | LOCK_REC_NOT_GAP)。 ) 文章来源: insert into加锁分析

数据结构(复习排序算法)――选泡插(选择,冒泡,插入,希尔)

匿名 (未验证) 提交于 2019-12-02 23:57:01
#include <stdio.h> /** * 希尔排序(优化) * 平均时间复杂度:O(n^1.3) * 平均空间复杂度:O(1) * 稳定性:不稳定 * 思想理念:分组,进行每个gap都进行除以2, * 这样大组分小,有利于数据的移动变小 **/ void shell_sort(int a[],int len){ for(int gap=len>>2;gap>0;gap/=2){ for(int i=gap;i<len;i++){ int j,tmp=a[i]; for(j=i;j>0&&tmp<a[j-gap];j-=gap){ a[j]=a[j-gap]; } a[j]=tmp; } } } /** * 插入排序(优化) * 平均时间复杂度:O(n^2) * 平均空间复杂度:O(1) * 稳定性:稳定 * 思想理念:从前到后进行循环,从后到前循环, * 如果前比后大,用一个下标记住,循环结束之后 * 进行交换 **/ void insertion_sort_update(int a[],int len){ for(int i=1;i<len;i++){ int j,tmp=a[i]; for(j=i;j>0&&tmp<a[j-1];j--){ a[j]=a[j-1]; } a[j]=tmp; } } /** * 插入排序 * 平均时间复杂度:O(n^2) *