mysql数据库加死锁⽅法_⽤sql语句,怎么处理mysql数据库死
对于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> LOCK TABLES real_table WRITE, insert_table WRITE;
mysql> INSERT INTO real_table SELECT * FROM insert_table;
mysql> TRUNCATE TABLE insert_table;
mysql> UNLOCK TABLES;
InnoDB 使⽤⾏级锁,BDB 使⽤页级锁。对于 InnoDB 和 BDB 存储引擎来说,是可能产⽣死锁的。这是因为 InnoDB 会⾃动捕获⾏
锁,BDB 会在执⾏ SQL 语句时捕获页锁的,⽽不是在事务的开始就这么做。
⾏级锁的优点有:
在很多线程请求不同记录时减少冲突锁。
事务回滚时减少改变数据。
使长时间对单独的⼀⾏记录加锁成为可能。
⾏级锁的缺点有:
⽐页级锁和表级锁消耗更多的内存。
当在⼤量表中使⽤时,⽐页级锁和表级锁更慢,因为他需要请求更多的所资源。
当需要频繁对⼤部分数据做 GROUP BY 操作或者需要频繁扫描整个表时,就明显的⽐其它锁更糟糕。
使⽤更⾼层的锁的话,就能更⽅便的⽀持各种不同的类型应⽤程序,因为这种锁的开销⽐⾏级锁⼩多了。
表级锁在下列⼏种情况下⽐页级锁和⾏级锁更优越:
很多操作都是读表。
在严格条件的索引上读取和更新,当更新或者删除可以⽤单独的索引来读取得到时:
mysql数据库的方法UPDATE tbl_name SET column=value WHERE unique_key_col=key_value;
DELETE FROM tbl_name WHERE unique_key_col=key_value;
SELECT 和 INSERT 语句并发的执⾏,但是只有很少的 UPDATE 和 DELETE 语句。
很多的扫描表和对全表的 GROUP BY 操作,但是没有任何写表。
表级锁和⾏级锁或页级锁之间的不同之处还在于:
将同时有⼀个写和多个读的地⽅做版本(例如在MySQL中的并发插⼊)。也就是说,数据库/表⽀持根据开始访问数据时间点的不同⽀持各种不同的试图。其它名有:时间⾏程,写复制,或者是按需复制。
复制代码 代码如下:
//执⾏SQL语句 锁掉stat_num表
$sql = "LOCK TABLES 表名 WRITE"; //表的WRITE锁定,阻塞其他所有mysql查询进程
mysql_query($sql);
//执⾏更新或写⼊操作
$sql = "UPDATE stat_num SET `correct_num`=`correct_num`+1 WHERE stat_date='{$cur_date}'";
mysql_query($sql);
//当前请求的所有写操作做完后,执⾏解锁sql语句
$sql = "UNLOCK TABLES";
mysql_query($sql);
取消
评论

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。