数据库原理、实践

"数据库原理、实践"

Posted by yueLng on 2017-11-28

数据库实践

数据库并发查询下 导致巨大时延?

SHOW PROCESSLIST 查看数据库连接,看哪个连接导致锁表
kill id //杀掉被锁的表

如何使用online DDL 增加字段
MySQL Online DDL - 腾讯云社区 - 腾讯云
没有使用 online DDL选项
主库增加了字段,通过binlog 同步到从库
执行alter 操作 会导致锁表,锁表导致
set old_alter_table=1; 设置进入onlineDDL 操作
[file:AC8E0600-AAAC-448E-A6F0-AECF999D63C6-375-0000098E4BA9BEB8/architecture of a database system.pdf]
主从同步是通过binlog进行的,从库有两个线程,一个负责接受binlog日志,一个负责解析日志将数据写入库中。所以主从同步一般是有一定的延时的。

Alter 锁表时 拿不到写锁 导致alter 语句执行时间过长,导致后面的同步失败
为什么alter拿不到锁,select 语句 慢调用 卡住了
For DBA | For dbas

至于读写锁的问题,写锁是排他的,读锁可以多次获得。在Innodb中,锁分为表锁、行锁和间隙锁,具体看你的操作,如果一个插入操作需要锁表,而这时有查询锁住了该表中的一行,自然是需要等待的。
??查询操作是不锁表的

使用锁还是版本控制来解决并发问题

两者都是方法和手段,并不冲突和矛盾。锁有很多不同的粒度,比如一把全局的大锁;再比如读写锁,任一时刻如果有写,就不能进行其它操作,而读锁之间相互不影响;我看了好些傻逼的实现都是一把全局大锁,像boltdb,还有leveldb的Go语言封装里面提供的Transaction接口,都是很没节操的。前阵子我还考虑过写一个RangeLock,调整锁的粒度:只有被同步访问到的key之间,才会有锁冲突,比如我在操作A他在操作B,相互是不影响的。遇到锁冲突了会变得复杂,回滚操作必须记得释放之前的锁,加锁也要有点技巧,如果一个操作锁了A去请求B,另一个操作锁了B去请求A,就成环死锁了。

MVCC也会遇到冲突,冲突时无非两种手段:过一会儿重试或者abort。看!这本质上也是锁,乐观锁悲观锁而已。所以并不是用了MVCC锁的概念就消失了。不过MVCC是个好东西,它比锁可以提供更细粒度的并发。通过读历史版本,让读和写之间的冲突进一步降低。代价当然是问题被搞得更加复杂了。

如何选择?根据实际的场景具体情况具体去分析。挑选适当的隔离级别,RC/RR/SI。

参考资料