mysql锁表相关知识
-
MYSQL锁表问题的解决方法本文实例讲述了MYSQL锁表问题的解决方法。分享给大家供大家参考,具体如下:很多时候!一不小心就锁表!这里讲解决锁表终极方法!案例一?1mysql>show processlist;参看sql语句一般少的话?1mysql>kill thread_id;就可以解决了kill掉第一个锁表的进程, 依然没有改善. 既然不改善, 咱们就想办法将所有锁表的进程kill掉吧, 简单的脚本如下.?123456#!/bin/bashmysql - u root - e " show processlist " | grep - i " Locked " >> locked_log . txtfor line in ` cat locked_log.txt | awk '{print $1 }' `doecho " kill $line ; " >> kill_thread_id . sqldone现在kill_t
-
[MySql]锁表与解锁摘要为啥会出现锁表的情况?锁表会导致数据表的其他操作超时,频繁的插入修改查询很容易出现锁表的情况。如果遇到这种情况,临时的解决办法,可以通过下面的方式进行解锁。如果长期有效的解决,那么就需要优化项目架构了。解锁第一种查找进程状态show processlist;通过查看state和info描述可以看到当前锁表的操作。找到对应的Id,通过下面的命令进行解锁KILL id第二种UNLOCK TABLES;
-
mysql锁表和解锁语句分享页级的典型代表引擎为BDB。 表级的典型代表引擎为MyISAM,MEMORY以及很久以前的ISAM。 行级的典型代表引擎为INNODB。 -我们实际应用中用的最多的就是行锁。行级锁的优点如下: 1)、当很多连接分别进行不同的查询时减小LOCK状态。 2)、如果出现异常,可以减少数据的丢失。因为一次可以只回滚一行或者几行少量的数据。 行级锁的缺点如下: 1)、比页级锁和表级锁要占用更多的内存。 2)、进行查询时比页级锁和表级锁需要的I/O要多,所以我们经常把行级锁用在写操作而不是读操作。 3)、容易出现死锁。 对于写锁定如下: 1)、如果表没有加锁,那么对其加写锁定。 2)、否则,那么把请求放入写锁队列中。 对于读锁定如下: 1)、如果表没有加写锁,那么加一个读锁。 2)、否则,那么把请求放到读锁队列中。 当然我们可以分别用low_priority 以及high_priority在写和读操作上来改变这些行为。如果想要在一个表上做大量的 INSERT 和 SELECT 操作,但是并行的插入却不可能时,可以将记录
-
mysql 锁表锁行语句分享(MySQL事务处理)复制代码 代码如下: mysql_query("set autocommit=0"); $list_one = $db->fetch_first("select * from prizes where id = ".$id." FOR UPDATE"); $db->query("DELETE from prizes WHERE id =".$list_one['id']); mysql_query("commit"); START TRANSACTION, COMMIT和ROLLBACK语法 复制代码 代码如下: START TRANSACTION | BEGIN [WORK] COMMIT [WORK] [AND [NO] CHAIN] [[NO] RELEASE] ROLLBACK [WORK] [AND [NO] CHAIN] [[NO] RELEASE] SET AUTO
mysql锁表相关课程
-
MySQL提升课程 全面讲解MySQL架构设计 如何获得MySQL最优性能?如何建立MySQL高可用集群?如何搭建稳定高效的MySQL环境?国内顶级电商公司数据库专家带你成为一名优秀的DBA。
讲师:sqlercn 中级 3797人正在学习
mysql锁表相关教程
- 2. 全局锁 MySQL 服务器可以支持全局读锁,可以通过 flush tables with read lock 或设置 read_only=1 来实现,全局锁与任何表锁都冲突。在 MySQL会 话中执行 flush tables 命令,获得全局读锁。mysql> flush tables with read lock;Query OK, 0 rows affected (0.00 sec)在 MySQL 另一个会话中,对表 customer 执行 lock tables 命令,查询会挂起。mysql> lock tables customer write;在第一个会话中执行 show processlist 查看线程状态,可以看到线程 13283816 的状态为 Waiting for global read lock。这是一个全局读锁,而不是表级别锁。mysql> show processlist\G*************************** 1. row *************************** Id: 13283789 User: root Host: localhost db: tempdbCommand: Query Time: 0 State: starting Info: show processlist*************************** 2. row *************************** Id: 13283816 User: root Host: localhost db: tempdbCommand: Query Time: 10 State: Waiting for global read lock Info: lock tables customer write2 rows in set (0.00 sec)
- 3. 命名锁 命名锁是一种表级别锁,它是 MySQL 服务器在重命名或删除表时创建。命名锁与普通的表锁冲突,无论是显式的还是隐式的表锁。在 MySQL会 话中执行 lock table s命令,在表 customer上 获得一个显式锁。mysql> lock tables customer read;Query OK, 0 rows affected (0.00 sec)在 MySQL 另一个会话中,对表 customer 执行 rename table 命令,此时会话会挂起,会话状态为Waiting for table metadata lock:mysql> rename table customer to customer_1;mysql> show processlist\G...*************************** 2. row *************************** Id: 51 User: root Host: localhost db: tempdbCommand: Query Time: 128 State: Waiting for table metadata lock Info: rename table customer to customer_1
- 1.2 隐式锁 除了显式锁会阻塞这样的操作,MySQL 在查询过程中也会隐式地锁住表。通过 sleep() 函数可以实现长时间的查询,然后 MySQL 会产生一个隐式锁。在 MySQL 会话中执行 sleep(30),在表 customer上 会获得一个隐式锁。mysql> select sleep(30) from customer;在 MySQL 另一个会话中,对表 customer 执行 lock tables 命令,查询会挂起。mysql> lock tables customer write;在第三个会话中执行 show processlist 查看线程状态,可以看到线程 13244135 的状态为 Waiting for table metadata lock。select 查询的隐式锁阻塞了 lock tables 中所请求的显式写锁。mysql> show processlist\G*************************** 1. row *************************** Id: 13244112 User: root Host: localhost db: tempdbCommand: Query Time: 6 State: User sleep Info: select sleep(30) from customer*************************** 2. row *************************** Id: 13244135 User: root Host: localhost db: tempdbCommand: Query Time: 2 State: Waiting for table metadata lock Info: lock tables customer write
- MySQL 服务器级别的锁等待 使用锁来控制资源共享的应用系统,如何处理锁的竞争问题是个头疼事。MySQL 有两个级别的锁等待,服务器级别和存储引擎级别,本节重点介绍服务器级别的锁等待。
- 1.1 显式锁 通过 lock tables和unlock tables 可以控制显式锁。在 MySQL 会话中执行 lock tables 命令,在表customer上会获得一个显式锁。mysql> lock tables customer read;Query OK, 0 rows affected (0.00 sec)在 MySQL 另一个会话中,对表 customer 执行 lock tables 命令,查询会挂起。mysql> lock tables customer write;在第一个会话中执行 show processlist 查看线程状态,可以看到线程 13239868 的状态为 Waiting for table metadata lock。在 MySQL 中,当一个线程持有该锁后,其他线程只能不断尝试获取。mysql> show processlist\G*************************** 1. row *************************** Id: 13239801 User: root Host: localhost db: tempdbCommand: Query Time: 0 State: starting Info: show processlist*************************** 2. row *************************** Id: 13239868 User: root Host: localhost db: tempdbCommand: Query Time: 12 State: Waiting for table metadata lock Info: lock tables customer write2 rows in set (0.00 sec)
- 1. 死锁 死锁是指两个或多个事务在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。当多个事务尝试以不同的顺序锁定资源,或者多个事务同时锁定同一个资源,都有可能产生死锁。场景:两个事务同时处理 customer 表两个事务同时执行了第一条 update 语句,更新并锁定了该行数据,紧接着又都执行第二条 update 语句,此时发现该行已经被对方锁定,然后两个事务都等待对方释放锁,同时又持有对方需要的锁,陷入死循环,需要外力介入才能解除死锁。mysql> CREATE TABLE `customer` ( `id` int(11) NOT NULL, `last_name` varchar(30) DEFAULT NULL, `first_name` varchar(30) DEFAULT NULL, `birth_date` date DEFAULT NULL, `gender` char(1) DEFAULT NULL, `balance` decimal(10,0) DEFAULT NULL, PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8事务1:start transaction;update customer set balance = 100 where id = 1;update customer set balance = 200 where id = 2;commit;事务2:start transaction;update customer set balance = 300 where id = 2;update customer set balance = 400 where id = 1;commit;为了解决死锁问题,数据库实现了各种死锁检测和死锁超时机制。越复杂的存储引擎,越能检测到死锁的循环以来,并返回错误,这是一种比较有效的办法。还有一种解决死锁的办法是:当锁等待超时后,放弃锁请求。InnoDB 存储引擎可以自动检测事务的死锁,并回滚一个或几个事务来防止死锁。但是有些场景 InnoDB是无法检测到死锁的,比如在同一事务中使用 InnoDB 之外的存储引擎、lock tables 设定表锁定的语句,此时要通过设置 innodb_lock_wait_timeout 这个系统参数来解决。通过锁等待超时来解决死锁问题,通常不是好的办法,因为很有可能导致大量事务的锁等待。当发生锁等待超时,数据库会抛出如下报错信息:ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction 调整 innodb_lock_wait_timeout 的方法有两种:临时:在MySQL中直接用命令行执行-- innodb_lock_wait_timeout的默认值为50秒mysql> show variables like 'innodb_lock_wait_timeout';+--------------------------+-------+| Variable_name | Value |+--------------------------+-------+| innodb_lock_wait_timeout | 50 |+--------------------------+-------+1 row in set (0.00 sec)mysql> set innodb_lock_wait_timeout=51;Query OK, 0 rows affected (0.00 sec)永久:将以下两个参数添加至配置文件 my.cnf,并重启 MySQL:innodb_lock_wait_timeout=50我们在程序设计时,也要尽可能的减小死锁发生的概率。以下是针对 InnoDB 存储引擎减小死锁发生概率的一些建议:类似业务模块,尽可能按照相同的访问顺序来访问,防止产生死锁;同一个事务中,尽可能做到一次锁定需要的所有资源,减少死锁发生概率;同一个事务中,不要使用不同存储引擎的表,比如 MyISAM 和 InnoDB 表出现在同一事务中;尽可能控制事务的大小,减少锁定的资源量和锁定时间长度;对于容易产生死锁的业务模块,尝试升级锁颗粒度,通过表级锁减少死锁发生概率。
mysql锁表相关搜索
-
mac osx
machine_start
macox
magellan
malloc
manifest
manifest文件
map
map 遍历
mapreduce编程
maps google com
margin
margin bottom
margin left
margin right
margin top
marginbottom
marginheight
marginleft
margintop