防止死锁

来源:互联网 发布:nokia c3软件 编辑:程序博客网 时间:2024/04/30 11:36

<!-- /* Font Definitions */ @font-face{font-family:"MS 明朝";panose-1:2 2 6 9 4 2 5 8 3 4;mso-font-alt:"MS Mincho";mso-font-charset:128;mso-generic-font-family:roman;mso-font-pitch:fixed;mso-font-signature:-1610612033 1757936891 16 0 131231 0;}@font-face{font-family:SimSun;panose-1:2 1 6 0 3 1 1 1 1 1;mso-font-alt:宋体;mso-font-charset:134;mso-generic-font-family:auto;mso-font-pitch:variable;mso-font-signature:3 135135232 16 0 262145 0;}@font-face{font-family:"MS ゴシック";panose-1:2 11 6 9 7 2 5 8 2 4;mso-font-alt:"MS Gothic";mso-font-charset:128;mso-generic-font-family:modern;mso-font-pitch:fixed;mso-font-signature:-1610612033 1757936891 16 0 131231 0;}@font-face{font-family:Century;panose-1:2 4 6 4 5 5 5 2 3 4;mso-font-charset:0;mso-generic-font-family:roman;mso-font-pitch:variable;mso-font-signature:647 0 0 0 159 0;}@font-face{font-family:"/@SimSun";panose-1:2 1 6 0 3 1 1 1 1 1;mso-font-charset:134;mso-generic-font-family:auto;mso-font-pitch:variable;mso-font-signature:3 135135232 16 0 262145 0;}@font-face{font-family:"/@MS 明朝";panose-1:2 2 6 9 4 2 5 8 3 4;mso-font-charset:128;mso-generic-font-family:roman;mso-font-pitch:fixed;mso-font-signature:-1610612033 1757936891 16 0 131231 0;}@font-face{font-family:"MS Pゴシック";panose-1:2 11 6 0 7 2 5 8 2 4;mso-font-charset:128;mso-generic-font-family:modern;mso-font-pitch:variable;mso-font-signature:-1610612033 1757936891 16 0 131231 0;}@font-face{font-family:"/@MS Pゴシック";panose-1:2 11 6 0 7 2 5 8 2 4;mso-font-charset:128;mso-generic-font-family:modern;mso-font-pitch:variable;mso-font-signature:-1610612033 1757936891 16 0 131231 0;}@font-face{font-family:"/@MS ゴシック";panose-1:2 11 6 9 7 2 5 8 2 4;mso-font-charset:128;mso-generic-font-family:modern;mso-font-pitch:fixed;mso-font-signature:-1610612033 1757936891 16 0 131231 0;} /* Style Definitions */ p.MsoNormal, li.MsoNormal, div.MsoNormal{mso-style-parent:"";margin:0mm;margin-bottom:.0001pt;text-align:justify;text-justify:inter-ideograph;mso-pagination:none;font-size:10.5pt;mso-bidi-font-size:12.0pt;font-family:Century;mso-fareast-font-family:"MS 明朝";mso-bidi-font-family:"Times New Roman";mso-font-kerning:1.0pt;}p{mso-margin-top-alt:auto;margin-right:0mm;mso-margin-bottom-alt:auto;margin-left:0mm;mso-pagination:widow-orphan;font-size:12.0pt;font-family:"MS Pゴシック";mso-bidi-font-family:"MS Pゴシック";}pre{margin:0mm;margin-bottom:.0001pt;mso-pagination:widow-orphan;tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt;font-size:12.0pt;font-family:"MS ゴシック";mso-bidi-font-family:"MS ゴシック";} /* Page Definitions */ @page{mso-page-border-surround-header:no;mso-page-border-surround-footer:no;}@page Section1{size:595.3pt 841.9pt;margin:99.25pt 30.0mm 30.0mm 30.0mm;mso-header-margin:42.55pt;mso-footer-margin:49.6pt;mso-paper-source:0;layout-grid:18.0pt;}div.Section1{page:Section1;}-->

MySQL于使用表级锁定的存引擎,表不会死的。过总是在一个查询开立即求所有必要的定并且是以同定表来管理。

在一个updateinsert操作繁的表中,少量数据测试候运行良好,在实际中,因数据量比大(21万条记录),会出锁现象, 用show processlist看,可以看到一个update句状Locked,一个delete句状Sending data看了一下参考手册,把定相料整理下来,以便自己记录和追踪该问题的解决情况:

MySQL 5.1支持MyISAMMEMORY行表级锁定,BDB页级锁定,InnoDB 行行级锁定。在多情况下,可以根据培测应用程序使用哪类锁型最好,但一般很难说出某个出的锁类型就比另一个好。一切取决于用程序,用 程序的不同部分可能需要不同的锁类型。了确定是否想要使用行级锁定的存引擎,看看用程序做什并且混合使用什么样选择和更新句。例如,大多数 Web用程序选择,而很少除,只对关键字的值进行更新,并且只插入少量具体的表。基本MySQL MyISAM置已经调节得很好。

MySQL于使用表级锁定的存引擎,表不会死的。过总是在一个查询开立即求所有必要的定并且是以同定表来管理。

WRITEMySQL使用的表方法原理如下:

如果在表上没有,在它上面放一个写

,把求放在写列中。

READMySQL使用的定方法原理如下:

如果在表上没有写定,把一个读锁定放在它上面。

,把锁请求放在读锁列中。

当一个定被定可被写列中的线程得到,然后是读锁列中的线程。

意味着,如果你在一个表上有多更新,SELECT句将等待直到没有更多的更新。

如果INSERT 句不冲突,可以自由MyISAM 表混合并行的INSERT SELECT 句而不需要定。

InnoDB 使用行定,BDB 使用页锁定。引擎,都可能存在死是因,在SQL理期InnoDB 动获得行定,BDB 页锁定,而不是在事动时获得。

级锁定的点:

· 当在线程中访问不同的行只存在少量定冲突。

· 滚时只有少量的更改。

· 可以长时间锁一的行。

级锁定的缺点:

· 页级或表级锁定占用更多的内存。

· 当在表的大部分中使用,比页级或表级锁定速度慢,因你必须获取更多的

· 如果你在大部分数据上 GROUP BY 操作或者必须经描整个表,比其它定明慢很多。

· 用高级别锁定,通支持不同的定,你也可以很容易地调节应用程序,因成本小于行级锁定。

在以下情况下,表先于页级或行级锁定:

· 表的大部分句用于取。

· 对严格的关键取和更新,你可以更新或除可以用一的取的关键字来提取的一行:

• 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中使用的),其中可以一个写操作,同取操作。数据或表支持数据依的不同视图,取决于访问时开始。其它共同的术语时间跟踪或者按需

· 按需制在多情况下先于页级或行级锁定。然而,在最坏的情况下,它可能比使用常规锁定使用多的内存。

· 除了行级锁定外,你可以使用用程序级锁定,例如在MySQL中使用GET_LOCK()RELEASE_LOCK()些是建定,它只能在运行良好的用程序中工作

达到最高定速度,除InnoDB BDB 之外,所有存引擎,MySQL使用表(而不是、行或者列)InnoDB BDB 表,如果你用LOCK TABLES定表,MySQL只使用表定;如果你不使用LOCK TABLES,因 InnoDB 使用自级锁定而BDB 使用页级锁定来保隔离。

但是于大表,于大多数用程序,表定比行定更好,但存在部分缺陷。表定使线程同从一个表中取操作,但如果一个线程想要行写操作,它必首先得独占访问。更新期,所有其它想要访问该表的线程必等待直到更新完成。

表更新通常情况认为比表索更重要,因此予它更高的这应确保更新一个表的不能饿,即使表上有很繁重的SELECT

定在这种情况下会造成问题,例如当线程正等待,因并且在线程可以理之前必有空。在这种情况下,所有想要访问现问题的表的线程也被置成等待状,直到有更多的硬可用。

定在下面的情况下也存在问题

· 一个客户发长时间运行的查询

· 然后,另一个客户对同一个表行更新。等待直到SELECT完成。

· 另一个客户对同一个表上出了另一个 SELECT 句。因UPDATE SELECT 高,SELECT 句等待UPDATE完成,并且等待第1 SELECT 完成。

下面描述了一些方法来避免或减少表定造成的争:

· 试图使 SELECT 句运行得更快。可能必须创建一些摘要(summary)表做到点。

· --low-priority-updatesmysqld所有更新(修改)一个表的句以比SELECT句低的。在这种情况下,在先前情形的第2SELECT句将在UPDATE句前行,而不需要等候第1 SELECT 完成。

· 可以使用SET LOW_PRIORITY_UPDATES=1句指定具体接中的所有更新使用低

· 可以用LOW_PRIORITY属性与一个特定的INSERTUPDATEDELETE

· 可以用HIGH_PRIORITY属性与一个特定的SELECT

· max_write_lock_count统变量指定一个低来启mysqldMySQL在具体数量的插入完成后临时提高所有等待一个表的SELECT 句的这样在一定数量的WRITE定后READ定。

· 如果你有INSERTSELECT问题,切到使用新的MyISAM表,因支持并SELECTINSERT

· 如果你同一个表混合插入和除,INSERT DELAYED将会有很大的帮助。

· 如果你同一个表混合使用 SELECT DELETE 句出现问题DELETE LIMIT 选项可以有所帮助。

· SELECT 句使用SQL_BUFFER_RESULT可以帮助使表时间变短。

· 可以更改mysys/thr_lock.c中的以使用一的列。在这种情况下,写定和读锁定将具有相同的一些用程序会有帮助。

里是一些MySQL中表定相的技巧:

· 如果不混合更新与需要在同一个表中检查许多行的选择,可以行并行操作。

· 可以使用 LOCK TABLES 来提高速度,因在一个定中多更新比没有定的更新要快得多。将表中的内容切分几个表也可以有所帮助。

· 如果在MySQL中表遇到速度问题,可以将表转换为 InnoDB BDB 表来提高性能。

 

 

原创粉丝点击