回答編集履歴

3 訂正

unishako

unishako score 353

2015/07/27 09:06  投稿

こんばんわ。
DELETEのためにも利用できます。
SELECT FOR UPDATEで先に行ロックしておくことになります。
```sql
BEGIN
SELECT * FORM tb WHERE `ID` = 1 FOR UPDATE
DELETE FORM tb WHERE `ID` = 1
COMMIT
```
追記
> SELECTした行を行ロックして他のプロセスから変更や参照されないようにして削除したいのです。
とのことですが、設定しているトランザクション分離レベル次第で、ロックしただけでは不十分です。
ご希望の**参照されないようにして・・・**というのは、ロック後は、参照処理がロック解除されるまで待たされるという動作でよろしいでしょうか?
ということでしたら、トランザクション分離レベルに`SERIALIZABLE`を設定する必要があります。
データベースがMySQLとのことでしたので、恐らくデフォルトは`READ COMMITTED`のはずです。
この状態でロックしても常にコミット済み(ロック前)の値が参照できてしまいます。
MySQLは分離レベルのデフォルトが`REPEATABLE READ`とのことですので、
この状態でロックしてもロック後でも変更後の値が参照できてしまいます。
トランザクション分離レベルについては、Google先生に聞いてもらえると詳しく解説されているサイトが出てきます。
2 追記

unishako

unishako score 353

2015/07/27 09:01  投稿

こんばんわ。
DELETEのためにも利用できます。
SELECT FOR UPDATEで先に行ロックしておくことになります。
```sql
BEGIN
SELECT * FORM tb WHERE `ID` = 1 FOR UPDATE
DELETE FORM tb WHERE `ID` = 1
COMMIT
```
```
追記
> SELECTした行を行ロックして他のプロセスから変更や参照されないようにして削除したいのです。
とのことですが、設定しているトランザクション分離レベル次第で、ロックしただけでは不十分です。
ご希望の**参照されないようにして・・・**というのは、ロック後は、参照処理がロック解除されるまで待たされるという動作でよろしいでしょうか?
ということでしたら、トランザクション分離レベルに`SERIALIZABLE`を設定する必要があります。
データベースがMySQLとのことでしたので、恐らくデフォルトは`READ COMMITTED`のはずです。
この状態でロックしても常にコミット済み(ロック前)の値が参照できてしまいます。
トランザクション分離レベルについては、Google先生に聞いてもらえると詳しく解説されているサイトが出てきます。
1 訂正

unishako

unishako score 353

2015/07/26 20:46  投稿

こんばんわ。
DELETEの際も利用できます。
SELECT FOR UPDATEで先に行ロックしておきます。
DELETEのためにも利用できます。
SELECT FOR UPDATEで先に行ロックしておくことになります。
```sql
BEGIN
SELECT * FORM tb WHERE `ID` = 1 FOR UPDATE
DELETE FORM tb WHERE `ID` = 1
COMMIT
```

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る