簡體   English   中英

並發更新Java中的Oracle表

[英]Concurrent updates to oracle table in Java


我正在開發具有某種“類似於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允許在單個查詢中求和,我不必檢索值並進行第二次查詢以使用新值進行更新,這很好。 他們還說在這里閱讀其他文章,他們說創建一個同步塊來鎖定對象,並讓Java處理不同線程之間的同步。 我選擇該方法接收的標點符號實例,這樣我可以想象用戶和值的不同組合將允許並發訪問該方法,但是會阻塞具有相同值的實例(我是否必須在標點符號上實現equals()?)

我們的數據庫是Oracle 10g,Server Weblogic 11g,Java 6和Linux(我不知道哪種口味)。

先感謝您!

您的同步策略不對。 synchronized使用括號之間的對象的固有鎖定。 如果您有兩個Punctuation實例,因為它們引用相同的user_id ,您可能會認為它們相等,因此Java不會在意:2個對象,所以2個鎖,所以沒有互斥。

我真的不明白為什么上面,沒有synchronized ,可能會產生死鎖:你更新表中的一行。 如果您有兩個並發事務,其中一個更新用戶1,然后是user2,而另一個更新用戶2,然后是user1,那么您可能會陷入死鎖。 但是即使那樣,數據庫仍會檢測到死鎖並為事務之一拋出異常。

您需要使用樂觀鎖定模式。 在此處查看更多詳細信息http://docs.jboss.org/jbossas/docs/Server_Configuration_Guide/4/html/The_CMP_Engine-Optimistic_Locking.html

可能是http://docs.jboss.org/jbossas/docs/Server_Configuration_Guide/4/html/The_CMP_Engine-Optimistic_Locking.html ,這是更底層的詳細信息

使用樂觀鎖識別並發問題后,您可能希望重試-您完全可以控制要做什么

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM