MySQL锁定表和无锁语句共享
的表级的典型代表是MyISAM引擎,内存,和很久以前的。
该行级的典型代表是InnoDB引擎。
-我们实际应用中最常用的是行锁。
行级锁的优点如下:
1)当多个连接分别查询时,锁定状态被减小。
2)如果出现异常,可以减少数据丢失,因为只能回滚少量数据的一行或几行。
行级锁的缺点如下:
1)比页级锁和表级锁占用更多内存。
2)我们需要更多的I/O,而不是页面级锁和查询表级锁,所以我们经常在写操作中使用行级锁而不是读操作。
3)很容易出现死锁。
写锁如下所示:
1)如果表未锁定,则将锁添加到表中。
2)或以其他方式将请求放入写锁队列中。
读取锁如下所示:
1)如果表不写锁,则添加一个读锁。
2)或以其他方式将请求放入读锁队列中。
当然,我们可以用low_priority和high_priority在改变这些行为的读写操作。
如果您想在表上做大量插入和选择操作,但是当并行插入不可能时,可以将记录插入临时表中,然后将临时表中的数据定期更新到实际表中:
MySQL >锁定表real_table写,insert_table写;
MySQL >插入real_table SELECT * FROM insert_table;
TRUNCATETABLE insert_table MySQL >;
解锁表;
InnoDB使用行级锁,而BDB使用页级锁,InnoDB和BDB存储引擎,它有可能产生死锁,这是因为InnoDB会自动捕捉行锁,而BDB捕捉页锁时,执行SQL语句,而不是在交易开始的时候做的。
行级锁的优点是:
当许多线程请求不同记录时冲突锁减少。
当回滚事务时,数据更改会减少。
锁定一行记录很长时间是可能的。
行级锁的缺点是:
比页级锁和表级锁占用更多内存。
在大量的表中使用时,它比页级锁和表级锁慢得多,因为他需要更多的资源。
当需要对大多数数据进行操作组或需要频繁扫描整个表时,显然比其他锁更糟糕。
使用更高级别的锁,支持各种不同类型的应用程序更为方便,因为锁比行级锁要便宜得多。
在下列情况下,表级锁比页面级和行级锁要好:
许多操作都在读表。
读取和更新关于索引的严格条件,当更新或删除时可以用单独的索引读取。
更新tbl_name设置列=价值,unique_key_col = key_value;
从tbl_name哪里unique_key_col = key_value删除;
SELECT和INSERT语句是同时执行的,但是只有少数更新和删除语句。
很多扫描表和操作组都是完整的表,但是没有写表。
表级锁和行级锁或页级锁之间的区别仍然存在:
同时将有一个版本和多个读取(例如MySQL中的并发插入),也就是说,数据库表支持根据开始访问数据的时间点的不同来支持各种不同的尝试。
复制代码代码如下所示:
锁定 / /执行SQL语句stat_num
为SQL =锁表stat_num写; / /表写锁,阻止所有其他MySQL查询过程
databasehandler美元->执行($ SQL);
更新或写入操作
为SQL = 更新stat_num集` correct_num ` = ` correct_num ` + 1 stat_date ={ }cur_date美元;
databasehandler美元->执行($ SQL);
当前请求全部写入操作完成,释放SQL语句
$解锁表;
databasehandler美元->执行($ SQL);