关于思拓

About Stogram

我们相信互联网,它绝不止于一个渠道或者一个平台, 它蕴含着促进社会发展和提升人们生活质量的无限可能。透过网络连接起一个个原本孤立的节点, 美妙的事情随之发生。

Mysql的那些事儿(部分涉及数据库知识总结)

发布于 2018/03/28 MySQL数据库

1.数据库常见索引类型:

1、B-Tree索引
2、哈希索引
3、空间数据索引(R-Tree)
4、全文索引

2.数据库并发问题:

1、Lost Update 更新丢失
    a. 第一类更新丢失,回滚覆盖:撤消一个事务时,在该事务内的写操作要回滚,把其它已提交的事务写入的数据覆盖了。
    b. 第二类更新丢失,提交覆盖:提交一个事务时,写操作依赖于事务内读到的数据,读发生在其他事务提交前,写发生在其他事务提交后,把其他已提交的事务写入的数据覆盖了。
2、Dirty Read 脏读:一个事务读到了另一个未提交的事务写的数据。
3、Non-Repeatable Read 不可重复读:一个事务中两次读同一行数据,可是这两次读到的数据不一样。
4、Phantom Read 幻读:一个事务中两次查询,但第二次查询比第一次查询多了或少了几行或几列数据。

参考:并发问题介绍

3.数据库事务隔离级别:

1、Read Uncommitted 读未提交:事务读不阻塞其他事务读和写,事务写阻塞其他事务写但不阻塞读。基本不用,会出现脏读,两次读取能读取到其他事务在期间未提交事务的数据。
2、Read Committed 读已提交:事务读不会阻塞其他事务读和写,事务写会阻塞其他事务读和写。一个事务只能看见已经提交事务所做的改变,会出现一个事务内两次select的结果不一样。这个是常用的事务隔离级别,综合考虑了性能和数据问题。
3、Repeatable Read 可重复读:事务读会阻塞其他事务事务写但不阻塞读,事务写会阻塞其他事务读和写。这是MySQL的默认事务隔离级别,它确保同一事务的多个实例在并发读取数据时,会看到同样的数据行。可重复读应该是无法解决提交覆盖的问题。
4、Serializable 串行化:最高的隔离级别,它通过强制事务排序,使之不可能相互冲突,从而解决幻读问题。简言之,它是在每个读的数据行上加上共享锁,可能导致大量的超时现象和锁竞争。

参考:事务隔离介绍

4.数据库锁:

1、锁的种类:
共享锁:特点不阻止其他session读同一个资源,阻塞update,共享锁可以同时在同一个资源,容易产生死锁。
更新锁:特点不阻止其他session读同一个资源,阻塞update,共享锁和更新锁可以同时在同一个资源上,可以解决死锁
排他锁:其它事务既不能读,又不能改排他锁锁定的资源。
意向锁:

5.项目里DB层面很多未提交的事务,原因是基本上都是因为出现的并发的DML同一行数据导致的,比如说两个并发的update同一行数据,后面的update语句而开启的事务就会等待第一个update执行完毕提交事务才能执行。