У меня странная проблема с базой данных Cassandra (версия 2.2.3) и использованием статических столбцов при написании некоторого доказательства концепции для простого приложения с функцией отправки денег.
Моя таблица:
CREATE TABLE transactions (
profile text,
timestamp timestamp,
amount text,
balance text,
lock int static,
PRIMARY KEY (profile, timestamp)) WITH CLUSTERING ORDER BY (timestamp ASC);
Первый шаг я добавляю новую запись
INSERT INTO transactions (profile, timestamp, amount) VALUES ( 'test_profile', '2015-11-05 15:20:01+0000', '10USD');
Затем я хочу «заблокировать» текущую пользовательскую транзакцию, чтобы выполнить какое-либо действие с его балансом. Я пытаюсь выполнить этот запрос:
UPDATE transactions SET lock = 1 WHERE profile = 'test_profile' IF lock = null;
Но как результат в cqlsh я вижу
[applied]
-----------
False
Я не понимаю, почему «False», потому что текущие данные для профиля:
profile | timestamp | lock | amount | balance
--------------+--------------------------+------+--------+---------
test_profile | 2015-11-05 15:20:01+0000 | null | 10USD | null
Любая идея, что я делаю неправильно?
ОБНОВЛЕНИЕ
После прочтения ответа Ненада Божича я изменил свой пример, чтобы уточнить, почему мне нужно условие в обновлении. Полный пример кода
CREATE TABLE transactions (
profile text,
timestamp timestamp,
amount text,
balance text,
lock int static,
balances map<text,text> static,
PRIMARY KEY (profile, timestamp)
) WITH CLUSTERING ORDER BY (timestamp ASC);
INSERT INTO transactions (profile, timestamp, amount) VALUES ( 'test_profile', '2015-11-05 15:20:01+0000', '1USD');
INSERT INTO transactions (profile, lock) VALUES ('test_profile', 1) IF NOT EXISTS;
BEGIN BATCH
UPDATE transactions SET balances={'USD':'1USD'} WHERE profile='test_profile';
UPDATE transactions SET balance='1USD' WHERE profile='test_profile' AND timestamp='2015-11-05 15:20:01+0000';
DELETE lock FROM transactions WHERE profile='test_profile';
APPLY BATCH;
И если я снова попытаюсь получить блокировку, я получу
INSERT INTO transactions (profile, lock) VALUES ('test_profile', 1) IF NOT EXISTS;
[applied] | profile | timestamp | balances | lock | amount | balance
-----------+--------------+-----------+-----------------+------+--------+---------
False | test_profile | null | {'USD': '1USD'} | null | null | null
cassandra 3.0.0-rc2
, и это работает... Но не работает в других версиях... - person greenhost87   schedule 05.11.2015