我在Titan中创建了一个具有多个线程的顶点。 这是我的代码
尝试连接到Titan,指定架构,然后添加顶点。
g = TitanFactory.open("/conf/titan-cassandra.properties");
TitanManagement mgmt = g.getManagementSystem();
final PropertyKey userid = mgmt.makePropertyKey("userid").dataType(Integer.class).make();
TitanGraphIndex namei = mgmt.buildIndex("userid",Vertex.class).addKey(userid).unique().buildCompositeIndex();
mgmt.setConsistency(namei, ConsistencyModifier.LOCK);
mgmt.commit();
然后我调用了一个添加顶点的函数
多个线程访问函数Add Vertex,它接受输入参数 - 随机生成的唯一数字(entityPK)
tx1 = g.newTransaction();
Vertex user_ver = tx1.addVertexWithLabel("user");
user_ver.setProperty("userid",entityPK);
//Adding other properties for vertex
tx1.commit();`
我读到引发的异常是因为没有指定LOCK。但即使在指定LOCK之后,也会抛出异常。
com.thinkaurelius.titan.core.TitanException:由于持久性异常而无法提交事务
答案 0 :(得分:0)
如果这段代码:
tx1 = g.newTransaction();
Vertex user_ver = tx1.addVertexWithLabel("user");
user_ver.setProperty("userid",entityPK);
//Adding other properties for vertex
tx1.commit();
位于您的addVertex
函数内,多个线程正在调用addVertex
,我认为您并未正确使用newTransaction
。这就产生了所谓的"线程交易"。线程事务是多个线程作用于SAME事务的事务。在您的使用中,每个线程都在创建自己的DIFFERENT事务。鉴于你所描述的内容,我会说正确的方法是让addVertex
成为:
Vertex user_ver = g.addVertexWithLabel("user");
user_ver.setProperty("userid",entityPK);
//Adding other properties for vertex
g.commit();
我也会考虑放弃锁定(除非你需要它)。