ruto on Nostr: Tsurugi ...
Tsurugi (劔)よくわからない。LTXの仕様がドキュメント化されていなくて(解説本には書いてあるかも)、それっぽいコードを実行したら普通にwrite skewが起きた。使い方が悪いのかもしれない。
次のSQLを実行した場合、serializableでないのでどちらかはCOMMITできないはずだけど、なぜかコミットできる。
```sql
-- 準備
CREATE TABLE test (
id int PRIMARY KEY,
value int NOT NULL
);
INSERT INTO test (id, value) VALUES (1, 1);
COMMIT;
-- transaction 1
BEGIN LONG TRANSACTION WRITE PRESERVE test;
-- 本来は
-- INSERT INTO test (id, value) VALUES (2, SELECT SUM(VALUE) + 1 FROM test);
-- と書きたいが、まだサポートされていないので、クライアント側でSELECT結果をINSERTに渡しているものとする。
SELECT SUM(value) + 1 FROM test;
INSERT INTO test (id, value) VALUES (2, 2);
-- transaction 2 (別の接続で実行する)
BEGIN LONG TRANSACTION WRITE PRESERVE test;
SELECT SUM(value) + 1 FROM test;
INSERT INTO test (id, value) VALUES (3, 2);
-- transaction 1に戻る
COMMIT;
-- transaction 2に戻る
COMMIT;
```
次のSQLを実行した場合、serializableでないのでどちらかはCOMMITできないはずだけど、なぜかコミットできる。
```sql
-- 準備
CREATE TABLE test (
id int PRIMARY KEY,
value int NOT NULL
);
INSERT INTO test (id, value) VALUES (1, 1);
COMMIT;
-- transaction 1
BEGIN LONG TRANSACTION WRITE PRESERVE test;
-- 本来は
-- INSERT INTO test (id, value) VALUES (2, SELECT SUM(VALUE) + 1 FROM test);
-- と書きたいが、まだサポートされていないので、クライアント側でSELECT結果をINSERTに渡しているものとする。
SELECT SUM(value) + 1 FROM test;
INSERT INTO test (id, value) VALUES (2, 2);
-- transaction 2 (別の接続で実行する)
BEGIN LONG TRANSACTION WRITE PRESERVE test;
SELECT SUM(value) + 1 FROM test;
INSERT INTO test (id, value) VALUES (3, 2);
-- transaction 1に戻る
COMMIT;
-- transaction 2に戻る
COMMIT;
```