并发控制 mysql MyISAM表锁
来源:互联网 发布:淘宝玩具店起名 编辑:程序博客网 时间:2024/05/14 02:59
锁是计算机协调多个进程或线程并发访问某一资源的机制 。在数据库中,除传统的 计算资源(如CPU、RAM、I/O等)的争用以外,数据也是一种供许多用户共享的资源。如何保证数据并发访问的一致性、有效性是所有数据库必须解决的一 个问题,锁冲突也是影响数据库并发访问性能的一个重要因素。 从这个角度来说,锁对数据库而言显得尤其重要,也更加复杂。本章我们着重讨论MySQL锁机制 的特点,常见的锁问题,以及解决MySQL锁问题的一些方法或建议。
MySQL锁概述
相对其他数据库而言,MySQL的锁机制比较简单,其最显著的特点是不同的存储引擎支持不同的锁机制。
比如,MyISAM和MEMORY存储引擎采用的是表级锁(table-level locking);
BDB存储引擎采用的是页面锁(page-level locking),但也支持表级锁;
InnoDB存储引擎既支持行级锁(row-level locking),也支持表级锁,但默认情况下是采用行级锁。
MySQL这3种锁的特性可大致归纳如下。
表级锁:开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最高,并发度最低。
行级锁:开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也最高。
页面锁:开销和加锁时间界于表锁和行锁之间;会出现死锁;锁定粒度界于表锁和行锁之间,并发度一般。
从上述特点可见,很难笼统地说哪种锁更好,只能就具体应用的特点来说哪种锁更合适!仅从锁的角度来说:表级锁更适合于以查询为主,只有少量按索引条件更新数据的应用,如Web应用;而行级锁则更适合于有大量按索引条件并发更新少量不同数据,同时又有并发查询的应用,如一些在线事务处理(OLTP)系统。这一点在本书的“开发篇”介绍表类型的选择时,也曾提到过。下面几节我们重点介绍MySQL表锁和 InnoDB行锁的问题,由于BDB已经被InnoDB取代,即将成为历史,在此就不做进一步的讨论了。
MyISAM表锁
- mysql> show status like 'table%';
- +-----------------------+-------+
- | Variable_name | Value |
- +-----------------------+-------+
- | Table_locks_immediate | 2979 |
- | Table_locks_waited | 0 |
- +-----------------------+-------+
可见,对MyISAM表的读操作,不会阻塞其他用户对同一表的读请求,但会阻塞对同一表的写请求;对 MyISAM表的写操作,则会阻塞其他用户对同一表的读和写操作;MyISAM表的读操作与写操作之间,以及写操作之间是串行的!根据如表20-2所示的 例子可以知道,当一个线程获得对一个表的写锁后,只有持有锁的线程可以对表进行更新操作。其他线程的读、写操作都会等待,直到锁被释放为止。
- Select sum(total) from orders;
- Select sum(subtotal) from order_detail;
- Lock tables orders read local, order_detail read local;
- Select sum(total) from orders;
- Select sum(subtotal) from order_detail;
- Unlock tables;
- mysql> lock table actor read;
- Query OK, 0 rows affected (0.00 sec)
- mysql> select a.first_name,a.last_name,b.first_name,b.last_name from actor a,actor b where a.first_name = b.first_name and a.first_name = 'Lisa' and a.last_name = 'Tom' and a.last_name <> b.last_name;
- ERROR 1100 (HY000): Table 'a' was not locked with LOCK TABLES
- mysql> lock table actor as a read,actor as b read;
- Query OK, 0 rows affected (0.00 sec)
- mysql> select a.first_name,a.last_name,b.first_name,b.last_name from actor a,actor b where a.first_name = b.first_name and a.first_name = 'Lisa' and a.last_name = 'Tom' and a.last_name <> b.last_name;
- +------------+-----------+------------+-----------+
- | first_name | last_name | first_name | last_name |
- +------------+-----------+------------+-----------+
- | Lisa | Tom | LISA | MONROE |
- +------------+-----------+------------+-----------+
- 1 row in set (0.00 sec)
- 并发控制 mysql MyISAM表锁
- 并发控制 mysql MyISAM表锁
- 并发控制 mysql MyISAM表锁
- 并发控制 mysql InnoDB表锁
- 并发控制 mysql InnoDB表锁
- MySQL MyISAM / PHP 高并发优化经验
- MySQL MyISAM/InnoDB高并发优化经验
- MySQL MyISAM / PHP 高并发优化经验
- MySQL MyISAM/InnoDB高并发优化经验
- MySQL MyISAM/InnoDB高并发优化经验
- MySQL MyISAM/InnoDB高并发优化经验
- MySQL MyISAM/InnoDB高并发优化经验
- MySQL MyISAM/InnoDB高并发优化经验
- MySQL的myisam解决并发读写解决方法
- MySQL MyISAM/InnoDB高并发优化经验
- MySQL MyISAM/InnoDB高并发优化经验
- MySQL MyISAM/InnoDB高并发优化经验
- MySQL MyISAM/InnoDB高并发优化经验
- viewDidUnload 被废弃
- MIME类型大全
- 疯狂java之学习笔记(26)----------jar
- CF 301 B School Marks
- Android视频播放项目总结之 使用VideoView定义自己的视频播放器
- 并发控制 mysql MyISAM表锁
- 导入JEECMS源代码到eclipse集成开发环境详细步骤
- C/C++常用头文件及函数
- Mailbox(getshell) writeup —— ret2libc的利用
- lightOJ 1336 Sigma Function
- Spring学习笔记(1)---------初识Spring
- oracle各个服务的作用
- poj 2151 概率dp(求概率)&&poj3071全概率公式
- 白话经典算法系列之七 堆与堆排序