test-transactions
上传用户:romrleung
上传日期:2022-05-23
资源大小:18897k
文件大小:7k
源码类别:

MySQL数据库

开发平台:

Visual C++

  1. #!/usr/bin/perl
  2. # Copyright (C) 2000 MySQL AB & MySQL Finland AB & TCX DataKonsult AB
  3. #
  4. # This library is free software; you can redistribute it and/or
  5. # modify it under the terms of the GNU Library General Public
  6. # License as published by the Free Software Foundation; either
  7. # version 2 of the License, or (at your option) any later version.
  8. #
  9. # This library is distributed in the hope that it will be useful,
  10. # but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  12. # Library General Public License for more details.
  13. #
  14. # You should have received a copy of the GNU Library General Public
  15. # License along with this library; if not, write to the Free
  16. # Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
  17. # MA 02111-1307, USA
  18. #
  19. # Test of transactions performance.
  20. #
  21. ##################### Standard benchmark inits ##############################
  22. use Cwd;
  23. use DBI;
  24. use Benchmark;
  25. #use warnings;
  26. $opt_groups=27;     # Characters are 'A' -> Z
  27. $opt_loop_count=10000;     # Change this to make test harder/easier
  28. $opt_medium_loop_count=100; # Change this to make test harder/easier
  29. $pwd = cwd(); $pwd = "." if ($pwd eq '');
  30. require "$pwd/bench-init.pl" || die "Can't read Configuration file: $!n";
  31. # Avoid warnings for variables in bench-init.pl
  32. # (Only works with perl 5.6)
  33. #our ($opt_small_test, $opt_small_tables, $opt_debug, $opt_force);
  34. if ($opt_small_test || $opt_small_tables)
  35. {
  36.   $opt_loop_count/=100;
  37.   $opt_medium_loop_count/=10;
  38. }
  39. if (!$server->{transactions} && !$opt_force)
  40. {
  41.   print "Test skipped because the database doesn't support transactionsn";
  42.   exit(0);
  43. }
  44. ####
  45. ####  Connect and start timeing
  46. ####
  47. $start_time=new Benchmark;
  48. $dbh = $server->connect();
  49. ###
  50. ### Create Table
  51. ###
  52. print "Creating tablesn";
  53. $dbh->do("drop table bench1");
  54. $dbh->do("drop table bench2");
  55. do_many($dbh,$server->create("bench1",
  56.      ["idn int NOT NULL",
  57.       "rev_idn int NOT NULL",
  58.       "region char(1) NOT NULL",
  59.       "grp int NOT NULL",
  60.       "updated tinyint NOT NULL"],
  61.      ["primary key (idn)",
  62.       "unique (region,grp)"]));
  63. do_many($dbh,$server->create("bench2",
  64.      ["idn int NOT NULL",
  65.       "rev_idn int NOT NULL",
  66.       "region char(1) NOT NULL",
  67.       "grp int NOT NULL",
  68.       "updated tinyint NOT NULL"],
  69.      ["primary key (idn)",
  70.       "unique (region,grp)"]));
  71. $dbh->{AutoCommit} = 0;
  72. ###
  73. ### Test insert perfomance
  74. ###
  75. test_insert("bench1","insert_commit",0);
  76. test_insert("bench2","insert_autocommit",1);
  77. sub test_insert
  78. {
  79.   my ($table, $test_name, $auto_commit)= @_;
  80.   my ($loop_time,$end_time,$id,$rev_id,$grp,$region);
  81.   $dbh->{AutoCommit}= $auto_commit;
  82.   $loop_time=new Benchmark;
  83.   for ($id=0,$rev_id=$opt_loop_count-1 ; $id < $opt_loop_count ;
  84.        $id++,$rev_id--)
  85.   {
  86.     $grp=$id/$opt_groups;
  87.     $region=chr(65+$id%$opt_groups);
  88.     do_query($dbh,"insert into $table values ($id,$rev_id,'$region',$grp,0)");
  89.   }
  90.   $dbh->commit if (!$auto_commit);
  91.   $end_time=new Benchmark;
  92.   print "Time for $test_name  ($opt_loop_count): " .
  93.     timestr(timediff($end_time, $loop_time),"all") . "nn";
  94. }
  95. ###
  96. ### Test rollback performance
  97. ###
  98. print "Test transactions rollback performancen" if($opt_debug);
  99. ##
  100. ## Insert rollback test
  101. ##
  102. #
  103. # Test is done by inserting 100 rows in a table with lots of rows and
  104. # then doing a rollback on these
  105. #
  106. {
  107.   my ($id,$rev_id,$grp,$region,$end,$loop_time,$end_time,$commit_loop,$count);
  108.   $dbh->{AutoCommit} = 0;
  109.   $loop_time=new Benchmark;
  110.   $end=$opt_loop_count*2;
  111.   $count=0;
  112.   for ($commit_loop=1, $id=$opt_loop_count ; $id < $end ;
  113.        $id++, $commit_loop++)
  114.   {
  115.     $rev_id=$end-$id;
  116.     $grp=$id/$opt_groups;
  117.     $region=chr(65+$id%$opt_groups);
  118.     do_query($dbh,"insert into bench1 values ($id,$rev_id,'$region',$grp,0)");
  119.     if ($commit_loop >= $opt_medium_loop_count)
  120.     {
  121.       $dbh->rollback;
  122.       $commit_loop=0;
  123.       $count++;
  124.     }
  125.   }
  126.   if ($commit_loop > 1)
  127.   {
  128.     $dbh->rollback;
  129.     $count++;
  130.   }
  131.   $end_time=new Benchmark;
  132.   print "Time for insert_rollback ($count:$opt_loop_count): " .
  133.     timestr(timediff($end_time, $loop_time),"all") . "nn";
  134. }
  135. ##
  136. ## Update rollback test
  137. ##
  138. #
  139. # Test is done by updating 100 rows in a table with lots of rows and
  140. # then doing a rollback on these
  141. #
  142. {
  143.   my ($id,$loop_time,$end_time,$commit_loop,$count);
  144.   $dbh->{AutoCommit} = 0;
  145.   $loop_time=new Benchmark;
  146.   $end=$opt_loop_count*2;
  147.   $count=0;
  148.   for ($commit_loop=1, $id=0 ; $id < $opt_loop_count ; $id++, $commit_loop++)
  149.   {
  150.     do_query($dbh,"update bench1 set updated=2 where idn=$id");
  151.     if ($commit_loop >= $opt_medium_loop_count)
  152.     {
  153.       $dbh->rollback;
  154.       $commit_loop=0;
  155.       $count++;
  156.     }
  157.   }
  158.   if ($commit_loop > 1)
  159.   {
  160.     $dbh->rollback;
  161.     $count++;
  162.   }
  163.   $end_time=new Benchmark;
  164.   print "Time for update_rollback ($count:$opt_loop_count): " .
  165.     timestr(timediff($end_time, $loop_time),"all") . "nn";
  166. }
  167. ##
  168. ## Delete rollback test
  169. ##
  170. #
  171. # Test is done by deleting 100 rows in a table with lots of rows and
  172. # then doing a rollback on these
  173. #
  174. {
  175.   my ($id,$loop_time,$end_time,$commit_loop,$count);
  176.   $dbh->{AutoCommit} = 0;
  177.   $loop_time=new Benchmark;
  178.   $end=$opt_loop_count*2;
  179.   $count=0;
  180.   for ($commit_loop=1, $id=0 ; $id < $opt_loop_count ; $id++, $commit_loop++)
  181.   {
  182.     do_query($dbh,"delete from bench1 where idn=$id");
  183.     if ($commit_loop >= $opt_medium_loop_count)
  184.     {
  185.       $dbh->rollback;
  186.       $commit_loop=0;
  187.       $count++;
  188.     }
  189.   }
  190.   if ($commit_loop > 1)
  191.   {
  192.     $dbh->rollback;
  193.     $count++;
  194.   }
  195.   $end_time=new Benchmark;
  196.   print "Time for delete_rollback ($count:$opt_loop_count): " .
  197.     timestr(timediff($end_time, $loop_time),"all") . "nn";
  198. }
  199. ###
  200. ### Test update perfomance
  201. ###
  202. test_update("bench1","update_commit",0);
  203. test_update("bench2","update_autocommit",1);
  204. sub test_update
  205. {
  206.   my ($table, $test_name, $auto_commit)= @_;
  207.   my ($loop_time,$end_time,$id);
  208.   $dbh->{AutoCommit}= $auto_commit;
  209.   $loop_time=new Benchmark;
  210.   for ($id=0 ; $id < $opt_loop_count ; $id++)
  211.   {
  212.     do_query($dbh,"update $table set updated=1 where idn=$id");
  213.   }
  214.   $dbh->commit if (!$auto_commit);
  215.   $end_time=new Benchmark;
  216.   print "Time for $test_name  ($opt_loop_count): " .
  217.     timestr(timediff($end_time, $loop_time),"all") . "nn";
  218. }
  219. ###
  220. ### Test delete perfomance
  221. ###
  222. test_delete("bench1","delete_commit",0);
  223. test_delete("bench2","delete_autocommit",1);
  224. sub test_delete
  225. {
  226.   my ($table, $test_name, $auto_commit)= @_;
  227.   my ($loop_time,$end_time,$id);
  228.   $dbh->{AutoCommit}= $auto_commit;
  229.   $loop_time=new Benchmark;
  230.   for ($id=0 ; $id < $opt_loop_count ; $id++)
  231.  {
  232.     do_query($dbh,"delete from $table where idn=$id");
  233.   }
  234.   $dbh->commit if (!$auto_commit);
  235.   $end_time=new Benchmark;
  236.   print "Time for $test_name  ($opt_loop_count): " .
  237.    timestr(timediff($end_time, $loop_time),"all") . "nn";
  238. }
  239. ####
  240. #### End of benchmark
  241. ####
  242. $sth = $dbh->do("drop table bench1" . $server->{'drop_attr'}) or die $DBI::errstr;
  243. $sth = $dbh->do("drop table bench2" . $server->{'drop_attr'}) or die $DBI::errstr;
  244. $dbh->disconnect; # close connection
  245. end_benchmark($start_time);