[PHP-users 23107]SQL SERVERでの排他ロックについて

sasayu sasayu @ eos.ocn.ne.jp
2004年 8月 27日 (金) 11:25:12 JST


はじめまして、大倉と申します。

環境:
Windows2000 Server IIS5.0
PHP 4.3.1
SQL Server7.0

において、DBの排他ロックがうまく行かずに困っています。

問題点:
下記のコードを2つのブラウザから同時に実行させると、2つともTABLEIDのSELECTで
同じ値を取ってしまいます。
TABLEIDはプライマリキーになっていますので、次のINSERTが実行されると片方のブ
ラウザからではユニークでないデータを追加しようとするので、エラーとなってしま
います。

両方のブラウザでエラーとならずに終了させる解決策はないでしょうか?
よろしくお願い致します。

#以下サンプルソース

//DBクラスインクルード
include("DB.php");

//DBオープン
$db = DB::connect("$dbType://$dbUser:$dbUser@$dbHost/$dbName");

//トランザクション開始
$sql="BEGIN TRANSACTION";
$result=$db->query($sql);

//トランザクションの分離レベル設定
$sql="SET TRANSACTION ISOLATION LEVEL SERIALIZABLE";
$result=$db->query($sql);

//TABLEID(プライマリキー)の最大値取得
$sql="SELECT * FROM TMP_TABLE ORDER BY TABLEID DESC";
$result=$db->query($sql);
$row=$result->fetchRow(DB_FETCHMODE_ASSOC);
if($row){
 $tableid=$row["TABLEID"] + 1;
}
else{
 $tableid=1;
}
$db->freeResult($result);

$sql="INSERT INTO TMP_TABLE VALUES($tableid,'test','test','test')";
$result=$db->query($sql);
if (DB::isError($result)){
 die("エラー"); //追加データがユニークでないためここでエラー
}
$db->freeResult($result);

//トランザクション終了
$sql="COMMIT TRANSACTION";
$result=$db->query($sql);

//DBクローズ
$db->disconnect();




PHP-users メーリングリストの案内