[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 メーリングリストの案内