正确使用Titan上的unique()索引:PermanentLockingException

时间:2016-09-02 18:25:33

标签: multithreading indexing locking titan unique-constraint

根据以后的实验进行更新:

最初我假设PermanentLockingException是由于我使用带锁定的唯一索引。我从索引图配置中删除了这个unique()属性,但仍然遇到了相同的PermanentLockingException。

为了澄清,我有两个单独的索引,我试图同时更新其中两个。我没有尝试从两个线程更新相同的索引并遇到此问题。

这向我表明,无论索引类型如何,Titan都会为每个基于索引的事务获得某种全局锁定?这意味着在任何给定时间Titan只能更新一个索引树?

这是对的吗?

由于

我使用Titan 1.0.0和Cassandra后端。我在Titan上创建了两个复合索引:

index1 =   mgmt.buildIndex(indexName, Vertex.class).
addKey(indexPropertyKey1).addKey(indexPropertyKey2).unique()
.buildCompositeIndex();


index2 =    mgmt.buildIndex(indexName, Vertex.class).
addKey(indexPropertyKey1).addKey(indexPropertyKey3).unique()
.buildCompositeIndex();

我这样做的目的是确保后端中只有1个条目与Key1 + Key2复合组合。我不想要任何重复。我想用index2强制执行相同的操作。

我的理解是这些是两种不同的索引结构,所以它们之间不应该发生任何冲突。但我注意到,当我尝试对index1和index2进行并发访问/更新时,我从Titan获得了一个locking.PermanentLockingException。如果连续访问它我不会遇到任何麻烦。

我有些问题:

  1. 我对unique()的使用是否正确?

  2. 我没有明确设置ConsistencyModifier.LOCK,所以我假设某个其他图层默认设置为true?这种方式或其他方面有关系吗?

  3. 这是两个不同的索引。所以他们的访问应该是互斥的。我在这里错过了什么吗?

  4. 他们共享一个属性键key1,这有关系吗?

  5. 如何允许并发访问这两个不同的索引?我可以明确地允许这个吗?它的成本是多少?

  6. 由于

    以下是有人感兴趣的错误:

    2016-09-01T12:17:19.29-0700 [App / 0] OUT [Z:C:] 2016-09-01 19:17:19 ERROR [pool-30-thread-1] cttgdStandardTitanGraph [StandardTitanGraph .java:695]由于系统提交中的存储异常,无法提交事务[8]

    2016-09-01T12:17:19.29-0700 [App / 0] OUT com.thinkaurelius.titan.core.TitanException:由于后端异常而无法执行操作

    2016-09-01T12:17:19.29-0700 [App / 0] OUT at com.thinkaurelius.titan.diskstorage.util.BackendOperation.execute(BackendOperation.java:44)

    2016-09-01T12:17:19.29-0700 [App / 0] OUT at com.thinkaurelius.titan.diskstorage.keycolumnvalue.cache.CacheTransaction.persist(CacheTransaction.java:87)

    2016-09-01T12:17:19.29-0700 [App / 0] OUT at com.thinkaurelius.titan.diskstorage.keycolumnvalue.cache.CacheTransaction.flushInternal(CacheTransaction.java:141)

    2016-09-01T12:17:19.29-0700 [App / 0] OUT at com.thinkaurelius.titan.diskstorage.keycolumnvalue.cache.CacheTransaction.commit(CacheTransaction.java:198)

    2016-09-01T12:17:19.29-0700 [App / 0] OUT at com.thinkaurelius.titan.diskstorage.BackendTransaction.commit(BackendTransaction.java:135)

    2016-09-01T12:17:19.29-0700 [App / 0] OUT at com.thinkaurelius.titan.graphdb.database.StandardTitanGraph.commit(StandardTitanGraph.java:692)

    2016-09-01T12:17:19.29-0700 [App / 0] OUT at com.thinkaurelius.titan.graphdb.transaction.StandardTitanTx.commit(StandardTitanTx.java:1352)

    2016-09-01T12:17:19.29-0700 [App / 0] OUT at com.thinkaurelius.titan.graphdb.tinkerpop.TitanBlueprintsGraph $ GraphTransaction.doCommit(TitanBlueprintsGraph.java:263)

    2016-09-01T12:17:19.29-0700 [App / 0] OUT at org.apache.tinkerpop.gremlin.structure.util.AbstractTransaction.commit(AbstractTransaction.java:94)

    2016-09-01T12:17:19.29-0700 [App / 0] OUT at com.ge.predix.acs.privilege.management.dao.GraphGenericRepository.save(GraphGenericRepository.java:113)

    2016-09-01T12:17:19.29-0700 [App / 0] OUT at com.ge.predix.acs.privilege.management.dao.ResourceMigrationManager.doResourceMigration(ResourceMigrationManager.java:52)

    2016-09-01T12:17:19.29-0700 [App / 0] OUT at com.ge.predix.acs.privilege.management.dao.ResourceMigrationManager.run(ResourceMigrationManager.java:34)

    2016-09-01T12:17:19.29-0700 [App / 0] OUT at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)

    2016-09-01T12:17:19.29-0700 [App / 0] OUT at java.util.concurrent.ThreadPoolExecutor $ Worker.run(ThreadPoolExecutor.java:617)

    2016-09-01T12:17:19.29-0700 [App / 0] OUT at java.lang.Thread.run(Thread.java:745)

    2016-09-01T12:17:19.29-0700 [App / 0] OUT引起:com.thinkaurelius.titan.diskstorage.locking.PermanentLockingException:KeyColumn的预期值不匹配[k = 0x 16-165-160- 114-116- 30-97-116-116-114-105-98-117-116-101-243,c = 0x 0]:expected = [] vs actual = [120-133](store = graphindex)< / p>

0 个答案:

没有答案