[摘要]+——————————-+——-+
5 rows in set (0.01 sec)MyISAM写锁实验: 对MyISAM表的读操作,不会阻塞其他用户对同一表的读请求,但会阻塞对同一表的写请求;对...
+——————————-+——-+
5 rows in set (0.01 sec)MyISAM写锁实验: 对MyISAM表的读操作,不会阻塞其他用户对同一表的读请求,但会阻塞对同一表的写请求;对MyISAM表的写操作,则会阻塞其他用户对同一表的读和写操作;MyISAM表的读操作与写操作之间,以及写操作之间是串行的!根据如表20-2所示的例子可以知道,当一个线程获得对一个表的写锁后,只有持有锁的线程可以对表进行更新操作。其他线程的读、写操作都会等待,直到锁被释放为止。 USER1:
当前session对锁定表的查询、更新、插入操作都可以执行:
mysql> select film_id,title from film_text where film_id = 1001; USER2:
mysql> select film_id,title from film_text where film_id = 1001; 等待 USER1: 释放锁:
mysql> unlock tables; USER2: 获得锁,查询返回: InnoDB存储引擎的共享锁实验
USER1:
mysql> set autocommit = 0;
USER2:
mysql> set autocommit = 0; USER1: 当前session对actor_id=178的记录加share mode 的共享锁:
mysql> select actor_id,first_name,last_name from actor where actor_id = 178lock in share mode; USER2: 其他session仍然可以查询记录,并也可以对该记录加share mode的共享锁:
mysql> select actor_id,first_name,last_name from actor where actor_id = 178lock in share mode; USER1: 当前session对锁定的记录进行更新操作,等待锁:
mysql> update actor set last_name = ‘MONROE T’ where actor_id = 178; 等待 USER2: 其他session也对该记录进行更新操作,则会导致死锁退出:
mysql> update actor set last_name = ‘MONROE T’ where actor_id = 178; ERROR 1213 (40001): Deadlock found when trying to get lock; try restarting transaction USER1: 获得锁后,可以成功更新:
mysql> update actor set last_name = ‘MONROE T’ where actor_id = 178;
Query OK, 1 row affected (17.67 sec)
Rows matched: 1 Changed: 1 Warnings: 0 InnoDB存储引擎的排他锁例子
USER1:
mysql> set autocommit = 0;
USER2:
mysql> set autocommit = 0; USER1: 当前session对actor_id=178的记录加for update的排它锁:
mysql> select actor_id,first_name,last_name from actor where actor_id = 178 for update; USER2: 其他session可以查询该记录,但是不能对该记录加共享锁,会等待获得锁:
mysql> select actor_id,first_name,last_name from actor where actor_id = 178; USER1: 当前session可以对锁定的记录进行更新操作,更新后释放锁:
mysql> update actor set last_name = ‘MONROE T’ where actor_id = 178; USER2: 其他session获得锁,得到其他session提交的记录:
mysql> select actor_id,first_name,last_name from actor where actor_id = 178 for update; 更新性能优化的几个重要参数 bulk_insert_buffer_size 批量插入缓存大小,这个参数是针对MyISAM存储引擎来说的.适用于在一次性插入100-1000+条记录时,提高效率.默认值是8M.可以针对数据量的大小,翻倍增加. concurrent_insert 并发插入,当表没有空洞(删除过记录),在某进程获取读锁的情况下,其他进程可以在表尾部进行插入. 值可以设0不允许并发插入, 1当表没有空洞时,执行并发插入, 2不管是否有空洞都执行并发插入. 默认是1针对表的删除频率来设置. delay_key_write 针对MyISAM存储引擎,延迟更新索引.意思是说,update记录时,先将数据up到磁盘,但不up索引,将索引存在内存里,当表关闭时,将内存索引,写到磁盘.值为 0不开启, 1开启.默认开启. delayed_insert_limit, delayed_insert_timeout, delayed_queue_size 延迟插入,将数据先交给内存队列,然后慢慢地插入.但是这些配置,不是所有的存储引擎都支持,目前来看,常用的InnoDB不支持, MyISAM支持.根据实际情况调大,一般默认够用了。 以上就是mysql数据库中锁机制的详细介绍的详细内容,更多请关注php中文网其它相关文章!
学习教程快速掌握从入门到精通的SQL知识。
|