gpt4 book ai didi

java - Java并发更新oracle表

转载 作者:行者123 更新时间:2023-12-02 00:16:58 25 4
gpt4 key购买 nike


我正在开发一个具有某种“类似 facebook”功能的应用程序。每当用户发布的内容被“喜欢”时,他的标点符号就会增加。该应用程序将被公司内的大量用户使用,因此我们预计同一行会有大量并发更新。

简化的代码

用户标点符号表

Punctuation(
userId NVARCHAR2(32),
value NUMBER(10,0)
)/


Java代码

public class Punctuation(){
private String userId;
private int value;

public Punctuation(final String userId, final int value){
this.userId = userId;
this.value = value;
}

public String getUserId();
public int getValue();

}

//simplified code
public final class PunctuationController{

private PunctuationController(){}

public static void addPunctuation(final Punctuation punctuation){

final Transaction transaction = TransactionFactory.createTransaction();
Connection conn = null;
PreparedStatment statment = null;
try{
synchronized(punctuation){
transaction.begin();
conn = transaction.getConnection();
statment = conn.preparedStatment("UPDATE Punctuation SET value = value + ? where userId = ?");
statment.setString('1', punctuation.getUserId());
statment.setInt('2', punctuation.getValue());
transaction.commit();
}
}catch (Exception e){
transaction.rollback();
}finally{
transaction.dispose();
if(statment !=null){
statment.close();
}
}
}



我们担心更新期间出现死锁。 Oracle 允许在单个查询上求和,我不必检索该值并进行第二个查询来更新新值,这很好。还在这里阅读了其他一些帖子,他们说创建一个同步块(synchronized block)来锁定一个对象,并让Java处理不同线程之间的同步。我选择方法接收的标点符号实例,这样我想象用户和值的不同组合将允许并发访问此方法,但会阻止具有相同值的实例(我是否必须在标点符号上实现 equals() ?)

我们的数据库是Oracle 10g、Server Weblogic 11g、Java 6 和Linux(我不知道是哪种风格)。

预先感谢您!

最佳答案

您的同步策略是错误的。 synchronized 使用括号之间对象的内在锁。如果您有两个您可能认为相等的 Punctuation 实例,因为它们引用相同的 user_id,Java 不关心:2 个对象,因此 2 个锁,因此没有互斥.

我真的不明白为什么上面的代码在没有同步的情况下会产生死锁:您正在更新表中的一行。如果您有两个并发事务,其中一个更新 user1,然后更新 user2,另一个更新 user2,然后更新 user1,则可能会出现死锁。但即便如此,数据库也会检测到死锁并为其中一个事务抛出异常。

关于java - Java并发更新oracle表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11738174/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com