質問するログイン新規登録

回答編集履歴

3

訂正

2015/07/27 00:06

投稿

退会済みユーザー
answer CHANGED
@@ -14,7 +14,7 @@
14
14
  とのことですが、設定しているトランザクション分離レベル次第で、ロックしただけでは不十分です。
15
15
  ご希望の**参照されないようにして・・・**というのは、ロック後は、参照処理がロック解除されるまで待たされるという動作でよろしいでしょうか?
16
16
  ということでしたら、トランザクション分離レベルに`SERIALIZABLE`を設定する必要があります。
17
- データベースがMySQLことでしたので、恐らくデフォルト`READ COMMITTED`のはずです
17
+ MySQLは分離レベルのデフォルト`REPEATABLE READ`ことですので、
18
- この状態でロックしても常にコミット済み(ロック前)の値が参照できてしまいます。
18
+ この状態でロックしてもロック後でも変更後の値が参照できてしまいます。
19
19
 
20
20
  トランザクション分離レベルについては、Google先生に聞いてもらえると詳しく解説されているサイトが出てきます。

2

追記

2015/07/27 00:06

投稿

退会済みユーザー
answer CHANGED
@@ -7,4 +7,14 @@
7
7
  SELECT * FORM tb WHERE `ID` = 1 FOR UPDATE
8
8
  DELETE FORM tb WHERE `ID` = 1
9
9
  COMMIT
10
- ```
10
+ ```
11
+
12
+ 追記
13
+ > SELECTした行を行ロックして他のプロセスから変更や参照されないようにして削除したいのです。
14
+ とのことですが、設定しているトランザクション分離レベル次第で、ロックしただけでは不十分です。
15
+ ご希望の**参照されないようにして・・・**というのは、ロック後は、参照処理がロック解除されるまで待たされるという動作でよろしいでしょうか?
16
+ ということでしたら、トランザクション分離レベルに`SERIALIZABLE`を設定する必要があります。
17
+ データベースがMySQLとのことでしたので、恐らくデフォルトは`READ COMMITTED`のはずです。
18
+ この状態でロックしても常にコミット済み(ロック前)の値が参照できてしまいます。
19
+
20
+ トランザクション分離レベルについては、Google先生に聞いてもらえると詳しく解説されているサイトが出てきます。

1

訂正

2015/07/27 00:01

投稿

退会済みユーザー
answer CHANGED
@@ -1,6 +1,6 @@
1
1
  こんばんわ。
2
- DELETEのも利用できます。
2
+ DELETEのためにも利用できます。
3
- SELECT FOR UPDATEで先に行ロックしておます。
3
+ SELECT FOR UPDATEで先に行ロックしておくことになります。
4
4
 
5
5
  ```sql
6
6
  BEGIN