高性能MySQL–MySQL架构与历史
- 3677
- MySQL
- 0
- super_dodo
- 2017/03/03
无论何时,只要有多个查询需要在同一时刻修改数据,都会产生并发控制的问题。在处理并发读或者写时,可以通过实现一个由两种类型的锁组成的锁系统来解决问题。这两种类型的锁通常被称为共享锁(shared lock)和排它锁(exclusive lock),也叫读锁(read lock)和写锁(write lock).读锁是共享的,或者说是相互不阻塞的。多个客户在同一时刻同时读取同一个资源,而互不干扰。写锁则是排他的,也就是说一个写锁会阻塞其他的写锁和读锁,这是出于安全策略的考虑。
表锁(table lock)是MySQL中最基本的锁策略,并且是开销最小的策略。行级锁(row lock)可以最大程度的支持并发处理(同时也带来了最大的锁开销)。
死锁是指两个或者多个事务在同一资源上相互占用,并请求锁定对方占用的资源从而导致恶性循环的现象。当多个事务试图以不同的顺序锁定资源时,就可能产生死锁。多个事务同时锁定同一个资源时,也会产生死锁。
//事务1 START TRANSACTION; UPDATE user SET age = 66 WHERE id = 1; UPDATE user SET age = 77 WHERE id = 2; COMMIT; //事务2 START TRANSACTION; UPDATE user SET age = 88 WHERE id = 2; UPDATE user SET age = 99 WHERE id = 1; COMMIT; //如果凑巧两个事务都执行了第一条update语句,更新了一行数据,同时也锁定了改行数据。 //接着每个事务都尝试去执行第二条update语句,却发现改行已被对方锁定。 //然后两个事务都等待对方释放锁,同时又持有对方需要的锁,则陷入死循环。 //除非有外部的因素接入才可能解除死锁。 //为了解决这种问题,数据库系统实现了各种死锁检测和死锁超时机制。 //InnoDB目前处理死锁的方法,将持有最少行级排它锁的事务进行回滚。 //大多数情况下只需要重新执行因死锁回滚的事务即可。
ACID表示原子性(atomicity)、一致性(consistency)、隔离性(isolation)和持久性(durability)。
MyISAM不支持事务和行级锁。InnoDB的行级锁工作得很好。
如果要用到全文索引,建议优先考虑InnoDB加上Sphinx的组合,而不是使用支持全文索引的MyISAM。
MySQL拥有分层的架构,上层是服务器层的服务和查询执行引擎,下层则是存储引擎。
真正的忘记,并非不再想起,而是偶尔想起,心中却不再有波澜。
相关阅读
- 通过Google API客户端访问Google Play帐户报告PHP库
- PHP执行文件的压缩和解压缩方法
- 消息中间件MQ与RabbitMQ面试题
- 如何搭建一个拖垮公司的技术架构?
- Yii2中ElasticSearch的使用示例
热门文章
- 通过Google API客户端访问Google Play帐户报告PHP库
- PHP执行文件的压缩和解压缩方法
- 消息中间件MQ与RabbitMQ面试题
- 如何搭建一个拖垮公司的技术架构?
- Yii2中ElasticSearch的使用示例
最新文章
- 通过Google API客户端访问Google Play帐户报告PHP库
- PHP执行文件的压缩和解压缩方法
- 消息中间件MQ与RabbitMQ面试题
- 如何搭建一个拖垮公司的技术架构?
- Yii2中ElasticSearch的使用示例