lock_test.pl
上传用户:dzyhzl
上传日期:2019-04-29
资源大小:56270k
文件大小:3k
源码类别:

模拟服务器

开发平台:

C/C++

  1. #!/my/gnu/bin/perl
  2. # This is a test with uses two processes to a database.
  3. # The other inserts records in two tables, the other does a lot of joins
  4. # on these.
  5. # Every time the read thread outputs info, it does a ALTER TABLE command
  6. # which should stop the insert thread until the ALTER TABLE command is ready.
  7. #
  8. # Warning, the output from this test will differ in 'found' from time to time,
  9. # but there should never be any errors
  10. #
  11. $host = shift || "";
  12. $test_db="test";
  13. $test_count=10000;
  14. srand 0; # Repeatable test
  15. use Mysql;
  16. $|= 1; # Autoflush
  17. $dbh = Mysql->Connect($host) || die "Can't connect: $Mysql::db_errstrn";
  18. $dbh->SelectDB($test_db) || die "Can't use database $test_db: $Mysql::db_errstrn";
  19. $firsttable  = "test_lock_1";
  20. $secondtable = "test_lock_2";
  21. $dbh->Query("drop table $firsttable");
  22. $dbh->Query("drop table $secondtable");
  23. print "Creating tables $firsttable and $secondtable in database $test_dbn";
  24. $dbh->Query("create table $firsttable (id int(6) not null, info char(32), auto int(11) not null auto_increment, primary key(id),key(auto))") or die $Mysql::db_errstr;
  25. $dbh->Query("create table $secondtable (id int(6) not null, info varchar(32), key(id))") or die $Mysql::db_errstr;
  26. $dbh=0; # Close handler
  27. if (fork() == 0)
  28. { # Insert process
  29.   $dbh = Mysql->Connect($host) || die "Can't connect: $Mysql::db_errstrn";
  30.   $dbh->SelectDB($test_db) || die "Can't use database $test_db: $Mysql::db_errstrn";
  31.   $first_id=1; $second_id=1;
  32.   $first_count=$second_count=0;
  33.   print "Writing startedn";
  34.   for ($i=1 ; $i <= $test_count ; $i++)
  35.   {
  36.     if (rand(3) <= 1)
  37.     {
  38.       $sth=$dbh->Query("insert into $firsttable values ($first_id,'This is entry $i',NULL)") || die "Got error on insert: $Mysql::db_errstrn";
  39.       die "Row not inserted, abortingn" if ($sth->affected_rows != 1);
  40.       $first_id++;
  41.       $first_count++;
  42.     }
  43.     else
  44.     {
  45.       $sth=$dbh->Query("insert into $secondtable values ($second_id,'This is entry $i')") || die "Got error on insert: $Mysql::db_errstrn";
  46.       die "Row not inserted, abortingn" if ($sth->affected_rows != 1);
  47.       $second_id++ if (rand(10) <= 1); # Don't always count it up
  48.       $second_count++;
  49.     }
  50.     print "Write: $in" if ($i % 1000 == 0);
  51.   }
  52.   print "Writing done ($first_count $second_count)n";
  53. }
  54. else
  55. {
  56.   $dbh = Mysql->Connect($host) || die "Can't connect: $Mysql::db_errstrn";
  57.   $dbh->SelectDB($test_db) || die "Can't use database $test_db: $Mysql::db_errstrn";
  58.   $locked=$found=0;
  59.   print "Reading startedn";
  60.   for ($i=1 ; $i <= $test_count ; $i++)
  61.   {
  62.     $id=int(rand($test_count)/3)+1;
  63.     $sth=$dbh->Query("select count(*) from $firsttable,$secondtable where $firsttable.id = $secondtable.id and $firsttable.id=$id") || die "Got error on select: $Mysql::db_errstrn";
  64.     $found++ if ($sth->numrows);
  65.     if ($i % 1000 == 0)
  66.     {
  67.       print "Read:  $i  Found: $foundn";
  68.       if ($found)
  69.       {
  70. $locked=1-$locked;
  71. if ($locked)
  72. {
  73.   $sth=$dbh->Query("lock tables $firsttable write,$secondtable write");
  74. }
  75. $sth=$dbh->Query("alter table $firsttable CHANGE id id int(6) not null") || die "Got error on ALTER TABLE: $Mysql::db_errstrn";
  76. $sth=$dbh->Query("alter table $secondtable CHANGE info info char(32) not null") || die "Got error on ALTER TABLE: $Mysql::db_errstrn";
  77. if ($locked)
  78. {
  79.   $sth=$dbh->Query("unlock tables");
  80. }
  81.       }
  82.     }
  83.   }
  84.   print "Reading done  Found: $foundn";
  85. }