Mysql中有两种比较重要的日志,一个 Mysql Server 实现的 归档日志(binlog),另外一个是 InnoDB 引擎特有的 重做日志(redo log)。
redo logredo log 是 InnoDB 中用来实现崩溃恢复的日志。
InnoDB 会将更新操作的内容保存到内存缓冲区中,在合适的时机或不得已的情况下再把缓冲区的数据更新到磁盘中,这样可以减少磁盘的随机读写,提高更新操作的性能。但是一旦程序崩溃,缓冲区中的数据就会丢失,为了实现崩溃恢复,InnoDB引入 redo log,执行更新语句的时候不但需要把更新的数据保存到内存缓冲区,还需要把更新的数据写到redo l...
读写锁从锁的粒度分,mysql的锁分为表锁和行锁,而无论表锁还是行锁,都有读写锁之分,读锁又称共享锁,写锁又称排它锁。
一般来说,读锁与读锁兼容,与写锁冲突;而写锁与写锁、读锁冲突。
表锁表锁是由Mysql服务器实现的。
表锁的类型有以下三种:
读写锁:LOCK_S(读锁),LOCK_X(写锁)
读写意向锁: LOCK_IS(读意向锁),LOCK_IX(写意向锁)
自增锁:LOCK_AUTO_INC
读写锁读写锁使用一次封锁技术,某个会话使用lock tables命令对要用到的表加锁以后,在释放这些锁之前,该会话只能访问那些加锁的表,不能访问其他表。
12345LOCK TABLES...
原文:https://www.aneasystone.com/archives/2017/12/solving-dead-locks-three.html
一、基本的加锁规则虽然 MySQL 的锁各式各样,但是有些基本的加锁原则是保持不变的,譬如:快照读是不加锁的,更新语句肯定是加排它锁的,RC 隔离级别是没有间隙锁的等等。这些规则整理如下,后面就不再重复介绍了:
常见语句的加锁
SELECT … 语句正常情况下为快照读,不加锁;
SELECT … LOCK IN SHARE MODE 语句为当前读,加 S 锁;
SELECT … FOR UPDATE 语句为当前读,加 X 锁;...
数据结构哈希表检索复杂度为O(1),但是范围查询、排序等功能,只适用于等值查询的场景。
B树 和 B+树B树和B+树的检索复杂度为O(log n),支持范围查询和排序。
B树和B+树的区别在于,B树在非叶子节点存储数据;而B+树在叶子节点按索引顺序存储数据,非叶子节点存储的都是索引值,在范围查询时能利用磁盘顺序读(叶子节点按索引顺序存储数据)来提高性能。
索引类型根据叶子节点的内容,分为主键索引和非主键索引:
主键索引:叶子节点存的是整行数据;在InnoDB里,主键索引也被称为聚簇索引(clustered index)。
非主键索引:叶子节点内容是主键的值。在InnnoDB里,非主键索...
事务并发存在的问题
更新丢失
第一类更新丢失, 回滚覆盖:撤消一个事务时,在该事务内的写操作要回滚,把其它已提交的事务写入的数据覆盖了。
第二类更新丢失, 提交覆盖:提交一个事务时,写操作依赖于事务内读到的数据,读发生在其他事务提交前,写发生在其他事务提交后,把其他已提交的事务写入的数据覆盖了。这是不可重复读的特例。
脏读一个事务读取了另一个事务未提交的数据。
不可重复读一个事务中,重复读取同一条记录,获取到不一样的数据。
幻读一个事务中,重复读取一个范围内的记录,获取到不一样的结果集。
不可重复读和幻读问题的本质都是事务读取了在事务期间其他事务提交的数据,不同的是不可重复...
driver.goconnector.go123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126// Con...
偶然看见golang之database/sql与go-sql-driver这篇博客,让我有了阅读学习go数据库访问接口和mysql驱动实现的源码的想法和动力。
因为刚好工作负责的组件中就是需要使用mysql,之前就出现过一些问题,但是因为当时对go database/sql和go-sql-driver/mysql的源码一点都不熟悉,只会用几个api,对于问题出现的原因一头雾水,希望通过阅读学习源码提升能力的同时,以后出现问题可以更加清楚应该怎么解决。
前言database/sql主要是提供了对数据库的读写操作的接口和数据库连接池功能,需要向其注册相应的数据库驱动才能工作。
go-sql...
变量
定义变量
12my_name="zhenlanghuo" #变量名和等号之间不能有空格for file in `ls /etc` #用for语句给变量赋值
使用变量
12 echo $your_name echo ${your_name} #加花括号可以帮助解释器识别变量的边界
参数的传递我们可以在执行 Shell 脚本时,向脚本传递参数,脚本内获取参数的格式为:$n。n 代表一个数字,1 为执行脚本的第一个参数,2 为执行脚本的第二个参...
查看文件内容
cat
连接文件并打印到标准输出设备上,经常用来显示文件的内容
当文件较大时,文本在屏幕上迅速闪过(滚屏),用户往往看不清显示的内容。因此一般用more等命令分屏显示。
123cat m1 在屏幕上显示文件ml的内容cat m1 m2 同时显示文件ml和m2的内容cat m1 m2 > file 将文件ml和m2合并后放入文件file中
more
基于vi编辑器文本过滤器,以全屏幕的方式按页显示文本文件的内容,支持vi中的关键字定位操作。
常用快捷键:H(获得帮助信息),Enter(向下翻滚一行...
普通的二叉查找树在插入有序的数据的时候会退化为链表,查找的时间复杂度退化为O(n)。而平衡二叉树在插入数据的时候一直保持二叉树的平衡,从而保证查找的时间复杂度维持在O(logn)。
平衡二叉树的定义一棵平衡二叉树是其每个结点的左子树和右子树的高度最多相差1的二叉查找树(空树的高度为-1)。
二叉树的高度——当前结点到叶子结点的最长路径
四种旋转的情况若平衡二叉树种某个结点的左子树和右子树的高度相差大于1,该树就是失衡了,该结点称为失衡点,就要通过旋转来保持二叉树的平衡。
一共分四种情况导致结点失衡:
在结点的左孩子的左子树中插入数据(LL)
在结点的左孩子的右子树中插入数据(L...