java - titan 图数据库中并发更新的问题

标签 java cassandra titan gremlin tinkerpop3

public class a {
    private static TitanGraph titanGraph = null;
    static GraphTraversalSource traversalSource = null;
public static void main(String a[])
{
    titanGraph = TitanFunctions.getTitanGraph();
    traversalSource = titanGraph.traversal();
    // Task to be executed by each thread
    Runnable r = new Runnable() {
        public void run() {

            long ab = traversalSource.V().has("RequestJob", "RequestId", 203)
                    .has("JobLockStatus","F")
                    .property("JobLockStatus", "B").count().next();
            titanGraph.tx().commit();
            System.out.println("value: "+ab+" : " +Thread.currentThread().getName());
        }
    };
    Thread t1 = new Thread(r, "T1");
    Thread t2 = new Thread(r, "T2");
    t1.start();
    t2.start(); 
    }}

在上面的程序中,两个并发线程正在尝试将同一个 RequestId=203 的值从 “F” 更新为 “B”
似乎两个线程都将状态值获取为 “F” 并将其更新为 B。 但我希望只有一个线程应该将值从“F”更改为“B”。更新值后,我还使用 commit() 来保存更改。
如果任何线程将状态从“(F)ree”更改为“(B)usy”..其他线程应该看到更改后的值..(“B”)。
请帮我解决这个问题。

最佳答案

您可以使用互斥体或 synchronized() block 来确保在任何给定时间只有一个线程可以执行该操作。像下面这样的东西可能会起作用:

titanGraph = TitanFunctions.getTitanGraph();
traversalSource = titanGraph.traversal();
Runnable r = new Runnable() {
    public void run() {
        synchronized(titanGraph){
            long ab = traversalSource.V().has("RequestJob", "RequestId", 203)
                .has("JobLockStatus","F")
                .property("JobLockStatus", "B").count().next();
            titanGraph.tx().commit();
        }    
    }
};
Thread t1 = new Thread(r, "T1");
Thread t2 = new Thread(r, "T2");
t1.start();
t2.start(); 

因此,上面的 block synchronized(titanGraph) 基本上是在说明,对于该 block 内的任何内容,它只能由对括号内的对象具有锁定的线程执行。在本例中为titanGraph。如果线程没有锁,那么它会等待锁变得可用。

Here是一个关于使用synchronized

的非常好的教程

关于java - titan 图数据库中并发更新的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42971443/

相关文章:

java - 将 EJB 注入(inject) JAX-RS(RESTful 服务)

java - 以编程方式在工作区中查找接口(interface)的引用

windows - 无法创建连接到 Cassandra 的 session

java - Cassandra : Getting read count for Index table in cassandra?

linux - 在 Linux 中将 Rexster 作为守护进程运行的脚本

json - Titan DB 图到 JSON

java - 使用单例 MainActivity?

csv - Cassandra .csv导入错误:batch too large

apache-storm - Storm 0.9.1 和 Titan 图形数据库 0.4.2 与 apache cassandra 2.0.7 作为存储后端的 Kryo 兼容性

java - 使用 XMLWorker 生成目录