SQLServerへodbc接続トランザクション
PHP 5.6.3
SQLServer 2014
IIS 8.5
Web上からPHPへPOSTし、SQLServerへODBC関数(http://php.net/manual/ja/ref.uodbc.php)を使用して接続しています。
その際「odbc_autocommit」を使用しトランザクションをかけているのですが、
同時にDBへ登録(Insert、Delete)をしたときに競合してしまいました。
そもそも「odbc_autocommit」の挙動として、
(1)A端末からDBへ接続
(2)A端末から「odbc_autocommit」を使用しトランザクション
(3)B端末からDBへ接続
(4)B端末から「odbc_autocommit」を使用しトランザクション
(5)A端末からTEST_TABLEへInsert
(6)B端末からTEST_TABLEへInsert
上記手順の(4)の動作の際に、A端末の操作が終わるまでBは待たされるorエラーでかえると想定していたのですが・・・
-----------------------------------------------------------
$serverCon = odbc_connect($serverName,$userName,$password);
if($serverCon === false){
$strMsg = ERRMSG_DBCONNECT;
writeLog($strMsg, DEBUG_LOG);
jumpSystemErrPage();
exit();
}
$boCon = true;
// 自動コミットをさせないようにする
$a = odbc_autocommit($serverCon,false);
if($a === false){
$strMsg = ERRMSG_DBCONNECT;
writeLog($strMsg, DEBUG_LOG);
$aaaa = odbc_errormsg($serverCon);
writeLog($aaaa, DEBUG_LOG);
jumpSystemErrPage();
exit();
}
-----------------------------------------------------------
確認方法として
A端末にてデバッグ状態から上記ソース上の
if($a === false){ の行でブレイクしてる最中に
B端末から普通に実行した際に
$aがfalseのルートに通らずそのまま次の処理へ行ってしまいました。
PHPのODBC接続で更新中にトランザクション(ロック)をかけるのはできないのでしょうか?
それとも自分のやり方が間違っているのでしょうか?
よろしくお願いします。
補足
既に開始はしていません・・・。 それに、この場合、既に開始されている、という メッセージになりますよね? 試しに、トランザクション開始を飛ばして、 commitしようとしたら、 アクティブなトランザクションはありません、とエラーになったので、 開始はされていないと思います。