泰坦图形数据库中的并发更新问题
issues with concurrent update in titan graph database
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();
}}
在上面的程序中,两个并发线程正在尝试更新值..从 “F” 到 “B” for同样的 RequestId=203
.
似乎两个线程都将状态值设为 “F” 并将其更新为 B。
但我只希望一个线程将值从“F”更改为“B”。更新值后,我还使用 commit() 来保存更改。
如果任何线程将状态从“(F)ree”更改为“(B)usy”..并且其他线程应该看到更改后的值..(“B”).
请帮我解决这个问题。
您可以使用互斥锁或 synchronized()
块来确保在任何给定时间只有一个线程可以执行该操作。像下面这样的东西可能会起作用:
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();
所以上面的块 synchronized(titanGraph)
基本上是在声明对于该块内的任何内容,它只能由对括号内的对象具有锁定的线程执行。在这种情况下 titanGraph
。如果一个线程没有锁,那么它会等待锁可用。
Here 是关于使用 synchronized
的非常好的教程
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();
}}
在上面的程序中,两个并发线程正在尝试更新值..从 “F” 到 “B” for同样的 RequestId=203
.
似乎两个线程都将状态值设为 “F” 并将其更新为 B。
但我只希望一个线程将值从“F”更改为“B”。更新值后,我还使用 commit() 来保存更改。
如果任何线程将状态从“(F)ree”更改为“(B)usy”..并且其他线程应该看到更改后的值..(“B”).
请帮我解决这个问题。
您可以使用互斥锁或 synchronized()
块来确保在任何给定时间只有一个线程可以执行该操作。像下面这样的东西可能会起作用:
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();
所以上面的块 synchronized(titanGraph)
基本上是在声明对于该块内的任何内容,它只能由对括号内的对象具有锁定的线程执行。在这种情况下 titanGraph
。如果一个线程没有锁,那么它会等待锁可用。
Here 是关于使用 synchronized