回答編集履歴
3
訂正
answer
CHANGED
@@ -14,7 +14,7 @@
|
|
14
14
|
とのことですが、設定しているトランザクション分離レベル次第で、ロックしただけでは不十分です。
|
15
15
|
ご希望の**参照されないようにして・・・**というのは、ロック後は、参照処理がロック解除されるまで待たされるという動作でよろしいでしょうか?
|
16
16
|
ということでしたら、トランザクション分離レベルに`SERIALIZABLE`を設定する必要があります。
|
17
|
-
|
17
|
+
MySQLは分離レベルのデフォルトが`REPEATABLE READ`とのことですので、
|
18
|
-
この状態でロックしても
|
18
|
+
この状態でロックしてもロック後でも変更後の値が参照できてしまいます。
|
19
19
|
|
20
20
|
トランザクション分離レベルについては、Google先生に聞いてもらえると詳しく解説されているサイトが出てきます。
|
2
追記
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
訂正
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
|