サンプル集  >  PHP  >  2つのコネクション
2つのコネクション
2009/07/13

php で MySQL へ2つ接続しパラメータに従ってコミットを切り分けます。

◆環境
OS Windows XP Professional Version 2002 Service Pack 3
PHP 5.2.4

transaction_test.php
 1: 
 2: 
 3: 
 4: 
 5: 
 6: 
 7: 
 8: 
 9: 
10: 
11: 
12: 
13: 
14: 
15: 
16: 
17: 
18: 
19: 
20: 
21: 
22: 
23: 
24: 
25: 
26: 
27: 
28: 
29: 
30: 
31: 
32: 
33: 
34: 
35: 
36: 
37: 
38: 
39: 
40: 
41: 
42: 
43: 
44: 
45: 
46: 
47: 
48: 
<?php
// 1つ目
$con1=mysql_connect("localhost:3306""root""root");
mysql_select_db("phptest", $con1);
mysql_query("begin", $con1);
for($i=0; $i<10; $i=$i+1){
    $sql="insert into test_tbl"
        ." values ('text1".$i."',".($i+10).")";
    if(!mysql_query($sql, $con1)){
        echo "追加失敗:".$sql."\n";
        exit(1);
    }
}

// 2つ目
$con2=mysql_connect("localhost:3306""root""root");
mysql_select_db("phptest", $con2);
mysql_query("begin", $con2);
for($i=0; $i<10; $i=$i+1){
    $sql="insert into test_tbl"
        ." values ('text2".$i."',".($i+20).")";
    if(!mysql_query($sql, $con2)){
        echo "追加失敗:".$sql."\n";
        exit(2);
    }
}

// 1つ目
if(strcmp($argv[1],"1")==0){
    mysql_query("commit", $con1);
    echo "con1 コミット\n";
}else{
    mysql_query("rollback", $con1);
    echo "con1 ロールバック\n";
}

// 2つ目
if(strcmp($argv[2],"1")==0){
    mysql_query("commit", $con2);
    echo "con2 コミット\n";
}else{
    mysql_query("rollback", $con2);
    echo "con2 ロールバック\n";
}

mysql_close($con1);
mysql_close($con2);
?>

まずは両方コミットを指定して実行します。

>php transaction_test.php 1 1
con1 コミット
con2 コミット

DB を確認します。

> select * from test_tbl;
+---------+--------+
| charVal | intVal |
+---------+--------+
| text10  |     10 |
| text11  |     11 |
| text12  |     12 |
| text13  |     13 |
| text14  |     14 |
| text15  |     15 |
| text16  |     16 |
| text17  |     17 |
| text18  |     18 |
| text19  |     19 |
| text20  |     20 |
| text21  |     21 |
| text22  |     22 |
| text23  |     23 |
| text24  |     24 |
| text25  |     25 |
| text26  |     26 |
| text27  |     27 |
| text28  |     28 |
| text29  |     29 |
+---------+--------+
20 rows in set (0.00 sec)

ちゃんと 20件入っています。 次は、2つ目をロールバックに指定して実行します。

>php transaction_test.php 1 0
con1 コミット
con2 ロールバック

DB を確認します。 ・・・20件入っていました。 上手くロールバックできてないですね。

調べたところ、mysql_connect の4番目に true を指定しないと、新しいリンクを確立しないようです。 早速修正します。

transaction_test.php
 1: 
 2: 
 3: 
 4: 
 5: 
 6: 
 7: 
 8: 
 9: 
10: 
11: 
12: 
13: 
14: 
15: 
16: 
17: 
18: 
19: 
20: 
21: 
22: 
23: 
24: 
25: 
26: 
27: 
28: 
29: 
30: 
31: 
32: 
33: 
34: 
35: 
36: 
37: 
38: 
39: 
40: 
41: 
42: 
43: 
44: 
45: 
46: 
47: 
48: 
<?php
// 1つ目
$con1=mysql_connect("localhost:3306""root""root");
mysql_select_db("phptest", $con1);
mysql_query("begin", $con1);
for($i=0; $i<10; $i=$i+1){
    $sql="insert into test_tbl"
        ." values ('text1".$i."',".($i+10).")";
    if(!mysql_query($sql, $con1)){
        echo "追加失敗:".$sql."\n";
        exit(1);
    }
}

// 2つ目
$con2=mysql_connect("localhost:3306""root""root", true);
mysql_select_db("phptest", $con2);
mysql_query("begin", $con2);
for($i=0; $i<10; $i=$i+1){
    $sql="insert into test_tbl"
        ." values ('text2".$i."',".($i+20).")";
    if(!mysql_query($sql, $con2)){
        echo "追加失敗:".$sql."\n";
        exit(2);
    }
}

// 1つ目
if(strcmp($argv[1],"1")==0){
    mysql_query("commit", $con1);
    echo "con1 コミット\n";
}else{
    mysql_query("rollback", $con1);
    echo "con1 ロールバック\n";
}

// 2つ目
if(strcmp($argv[2],"1")==0){
    mysql_query("commit", $con2);
    echo "con2 コミット\n";
}else{
    mysql_query("rollback", $con2);
    echo "con2 ロールバック\n";
}

mysql_close($con1);
mysql_close($con2);
?>

もう一度、2つ目をロールバックに指定して実行します。

>php transaction_test.php 1 0
con1 コミット
con2 ロールバック

DB を確認します。

>mysql select * from test_tbl;
+---------+--------+
| charVal | intVal |
+---------+--------+
| text10  |     10 |
| text11  |     11 |
| text12  |     12 |
| text13  |     13 |
| text14  |     14 |
| text15  |     15 |
| text16  |     16 |
| text17  |     17 |
| text18  |     18 |
| text19  |     19 |
+---------+--------+
10 rows in set (0.00 sec)

できました。 ちゃんと2つ目の insert はロールバックされています。

▲ PageTop  ■ Home


Copyright (C) 2012 ymlib.com