2016-09-10 5 views
6

मैं निम्नलिखित कोड है:सी * एक अद्यतन खो सकते हैं सम्मिलित मौजूद नहीं है के बाद

def main(args: Array[String]): Unit = { 
    val cluster = Cluster.builder() 
    .addContactPoint("localhost") 
    .withPort(9042) 
    .build() 
    val session = cluster.connect() 

    try { 
    session.execute(s"CREATE KEYSPACE demoks WITH REPLICATION = {'class':'SimpleStrategy', 'replication_factor':1}") 
    } catch { 
    case _: AlreadyExistsException => 
    } 

    session.execute(s"USE demoks") 
    session.execute("DROP table IF EXISTS demo") 

    session.execute(  """ 
          | CREATE TABLE IF NOT EXISTS demo (
          | id text, 
          | data1 map<text, text>, 
          | data2 map<text, text>, 
          | PRIMARY KEY (id) 
          |) WITH 
          | compaction = {'class': 'LeveledCompactionStrategy'} 
          | AND 
          | compression = { 'sstable_compression' : 'SnappyCompressor' }; 
         """.stripMargin).one() 

    val p1 = session.prepare("UPDATE demo SET data1[?]=?, data2[?] = ? WHERE id=?") 
    val p3 = session.prepare("INSERT INTO demo (id,data1) VALUES (?,?) IF NOT EXISTS") 

    import scala.collection.JavaConverters._ 

    val id2 = "id2-"+System.nanoTime() 
    session.execute(p3.bind(id2, Map("key" -> "value1-q1").asJava)) 
    session.execute(p1.bind("key", "value1-q2", "key", "value2-q2", id2)) 

    System.exit(0) 
} 

इस स्निपेट के निष्पादन के बाद मैं बस कर रहा हूँ cqlsh में select * from demo;:

आमतौर पर परिणाम सही है और अपेक्षित:

cqlsh:demoks> select * from demo; 

id     | data1    | data2 
--------------------+----------------------+---------------------- 
id2-61510117409472 | {'key': 'value1-q2'} | {'key': 'value2-q2'} 

(1 rows) 

लेकिन कभी-कभी यह अलग हो सकता है।

cqlsh:demoks> select * from demo; 

id     | data1    | data2 
--------------------+----------------------+---------------------- 
id2-61522373234949 | {'key': 'value1-q1'} | {'key': 'value2-q2'} 

(1 rows) 

किसी को भी मेरे इस व्यवहार समझा सकते हैं: कि प्रश्नों की तरह पुनर्क्रमित किया गया है और IF NOT EXISTS ट्रिगर नहीं लग रहा है?

यह कैसंड्रा 3.7 विंडोज मशीन पर डॉकर में चल रहा है। मैं इस व्यवहार को लिनक्स के तहत और मैक उसी मशीन और अन्य सभी मशीनों पर पुन: पेश नहीं कर सकता। मैंने डॉकर और नंगे इंस्टॉलेशन दोनों की कोशिश की। इसके अलावा, मैं एक ही मशीन पर नंगे स्थापना के साथ भी इसे पुन: उत्पन्न नहीं कर सकता।

+0

क्या हो रहा है यह समझने के लिए अपने क्लाइंट कोड को पोस्ट करें। – xmas79

+0

ठीक है, मैंने एक स्निपेट पोस्ट किया है। –

+0

फिर से क्षमा करें, आपको अपना टूटा हुआ डेटा भी पोस्ट करना चाहिए। अधिक सटीक, आपको अपना क्लाइंट कोड पोस्ट करना चाहिए और आप वापस क्या प्राप्त कर सकते हैं। इसे देखे बिना कहना मुश्किल है। – xmas79

उत्तर

0

मूल रूप से कोई गारंटी नहीं है कि आपके द्वारा प्रदान किए गए डालने, अपरिवर्तनीय बयान क्लस्टर में समाप्त हो जाएंगे। अधिकांश समय आपको वह व्यवहार मिलेगा जो आप उम्मीद करते हैं, लेकिन हमेशा नहीं। यह कुछ कारकों पर निर्भर करता है, आप जिस समन्वयक को मार रहे हैं, वह समय क्या है।

आप बयानों आप उपयोग कर "टाइमस्टैम्प का उपयोग करते हुए" से उत्पादन पर समय अपने आप को स्थापित करने के दो विकल्प हैं, या तो है कि आप अपने बयान के निष्पादन के आदेश की गारंटी आप बैचों का उपयोग कर सकते हैं: आप शायद चाहिए

// your code 
Batch batch = QueryBuilder.unloggedBatch() 
batch.add(binded p3) 
batch.add(binded p1) 

// now execute the batch 
session.execute(batch) 
संबंधित मुद्दे