10bet网址
MySQL内部手册


26.8.3附加会话的风险处理

断开是异步执行的。这很可能对通常应用程序的吞吐量有好处,但对测试开发有一些令人讨厌的后果。

如果一个

  • > <连接或断开

  • 杀死< connection_id >

  • ——exec <连接到服务器>的客户端程序

发生在mysqltest的脚本中,即使disconnect或kill没有完全完成,下一个语句也将被执行。

我猜这也适用于一个测试的结束(->结束的语句将由mysqltest执行)。它为任何打开的会话触发一些断开连接,但这也是异步的。

不完全完成意味着会话在进程列表中是可见的,关于会话的“退出”的条目还没有附加到一般日志中。

因此,后续的测试可能会受到意外事件的影响,比如

  • 在进程列表中观察属于前一个测试的会话

  • 在一般日志中发现一个条目(断开连接的会话的“退出”)不是由它自己的活动引起的,等等。

根据我的经验,一些测试可能会由于未完成的断开而损害到一个成功的测试,这种可能性随着时间的推移而增加

  • 额外的平行负载在测试箱上

  • 测试中缺少“disconnect

  • “disconnect ”,“KILL ”或“——exec…”与测试结束之间的距离更短

  • 会话在断开之前运行一个“重”SQL语句

在我看来,最有效的解决方案是增加一个

——包括/ wait_until_disconnected.inc来源

就在断开连接之后。

如果你不相信我,请稍后运行下面的代码片段

./mtr——skip-ndb——no-check-testcases——repeat=100 

你很可能会观察到

测试结果(ms ) ------------------------------------------------------------ ... [pass] 4  [fail]…CURRENT_TEST: —— +++  @@ -1,4 +1,4 @@ SELECT COUNT(*) FROM information_schema。processlist WHERE id < CONNECTION_ID();Count (*) -0 +1 select sleep (10);...mysqltest:结果内容不匹配

用于演示的片段:

SELECT COUNT(*) FROM information_schema。processlist WHERE id < CONNECTION_ID();# connect (con1,localhost,root,,);发送选择睡眠(10);#连接默认值;让$wait_condition= SELECT COUNT(*) = 1 FROM information_schema。processlist WHERE State = 'User sleep' AND Info = 'SELECT sleep (10)';——包括/ wait_condition来源。从信息模式中选择COUNT(*) = 1。processlist WHERE State = 'User sleep' AND Info = 'SELECT sleep (10)';#(4)断开con1;<脚本>的结束

代码片段用于演示目的,包含明显的“垃圾”代码,但需要强制执行预期的效果。一些注意事项:

  • (1)在测试开始时的这种声明使该测试对未完成的断开非常敏感。

  • (2)等待例程(3)防止我们对进程列表(4)的查找过早发生=在服务器开始处理(2)之前。否则,在高并行负载下,我们会得到(4)的随机结果集差异。

  • 如何防止本次测试对后续测试造成伤害?

(5)应改为连接con1;断开con1;——包括/ wait_until_disconnected.inc来源connection default;
  • “垃圾”在哪里?

  • 对于前面的每个“send ”都应该有一个“reap”。这不仅是为了学术的完整性,也是为了确保(2)是真正完成的。

  • 我们真的需要10秒的睡眠时间吗?根据我的经验,在高负荷下,睡眠时间<= 2秒是至关重要的。(5)睡觉呢?