2012-11-30 35 views
11

Tôi đang phát triển một ứng dụng web nhỏ để nghiên cứu Apache Cassandra và Java EE 6. Phiên bản Cassandra là 1.1.6.Apache Cassandra xóa khỏi bộ đếm

Có một vấn đề lái xe cho tôi điên ... Tôi tạo ra một bảng với một bộ đếm

CREATE TABLE test (
    author varchar PRIMARY KEY, 
    tot counter 
) 

và đặt một số giá trị theo cách này (sử dụng cqlsh v 3.0.0.):

update test set tot = tot +1 where author = 'myAuthor'; 

họ cột được cập nhật hoàn toàn

author | tot 
----------+----- 
myAuthor | 1 

NHƯNG, nếu bạn cố gắng xóa hàng này và t hen cập nhật một lần nữa (với cùng một khóa), sau đó không có gì xảy ra! Bảng không được cập nhật nhiều hơn và tôi không thể hiểu tại sao: có vẻ như với tôi rằng khi bạn đã sử dụng một khóa thì bạn không thể sử dụng nó nữa. Tôi đã tìm manh mối trong tài liệu về dữ liệu (http://www.datastax.com/docs/1.1/references/cql/cql_lexicon) nhưng không tìm được giải pháp.

Ai đó có thể giúp tôi không? Cảm ơn trước

+0

Nếu tôi muốn thay đổi giá trị của bộ đếm, tôi phải cập nhật bộ đếm cập nhật _table_ set _counter_ = _counter_ -1 nhưng câu hỏi của tôi là: tại sao tôi không thể sử dụng phím xóa nữa? – besil

Trả lời

15

Cassandra có một số giới hạn nghiêm ngặt về việc xóa bộ đếm. Bạn không thể thực sự xóa một bộ đếm và sau đó sử dụng nó một lần nữa trong bất kỳ khoảng thời gian ngắn nào. Từ số Cassandra wiki:

Loại bỏ bộ đếm thực sự bị giới hạn. Ví dụ, nếu bạn phát hành rất nhanh chuỗi "increment, remove, increment" thì có thể xóa bỏ (nếu vì lý do nào đó, việc xóa sẽ xảy ra là các tin nhắn nhận được cuối cùng). Do đó, loại bỏ các quầy được cung cấp để loại bỏ dứt khoát chỉ, đó là khi truy cập đã xóa không tăng sau đó. Điều này cũng giữ cho việc xóa hàng: nếu bạn xóa một hàng đếm, tăng bất kỳ bộ đếm nào trong hàng đó (tồn tại trước khi xóa) sẽ dẫn đến một hành vi chưa được xác định. Lưu ý rằng nếu bạn cần đặt lại bộ đếm, một tùy chọn (rất tiếc là không an toàn đồng thời) có thể là để đọc giá trị của nó và giá trị cộng thêm.

+0

Làm cách nào để khắc phục sự cố nếu bạn đã xóa hàng trước khi đọc? – OrangeDog

1

Các giải pháp để tái thêm một phím truy cập xóa là để thanh trừng tất cả kỷ lục của nó từ bảng:

nodetool repair $table 
cqlsh -c "ALTER TABLE $table WITH gc_grace_seconds=1;" 
sleep 1 
nodetool compact $table 

Như bạn có thể tưởng tượng, điều này là không thực tế trong một hệ thống thực tế và nên có lẽ được dành riêng cho trường hợp khẩn cấp nếu một bộ đếm quan trọng bằng cách nào đó vô tình bị xóa.

Tốt hơn là đảm bảo rằng không bao giờ có thể xảy ra.

Các vấn đề liên quan