Как гарантировать, что будет создана только строка таблицы с определенным состоянием? - PullRequest
1 голос
/ 22 мая 2009

У меня есть объект домена, который выглядит примерно так:

class UserStuff 
{
    String userid;
    boolean primordial;
}

В таблице изначальный является TINYINT . A User может иметь много UserStuff . Я хочу убедиться, что только одна строка (первая созданная строка) будет иметь первичное значение == 1. Все последующие строки будут иметь изначальное значение == 0. На первый взгляд беспокоиться не о чем. Давайте предположим, что несколько запросов на создание UserStuff могут выполняться одновременно, как я могу гарантировать это ограничение?

Моя первоначальная идея - синхронизировать по строке (в доменной службе)

class DomainService
{
    public void create( UserStuff stuff )
    {
        synchronized( stuff.userid + "/userstuff/lock" )
        {
            ...

        }
    }
}

Я хотел бы услышать комментарии об этом и альтернативных методах. Спасибо

1 Ответ

1 голос
/ 22 мая 2009

Подход SQL, вообще говоря, состоит в том, чтобы сделать (userid, primordial) уникальным составным ключом и использовать оператор INSERT с предложением ON DUPLICATE KEY UPDATE, которое в противном случае устанавливает primordial (но я признаю, что я Я не уверен, что произойдет, если UPDATE также попадет в дубликат, как если бы вы вставили second non-primordial UserStuff).

В качестве альтернативы, с соответствующим образом изолированными транзакциями, вы можете сначала SELECT проверить, присутствует ли userid, а затем внутри той же транзакции INSERT с соответствующими значениями primordial.

Подход SQL был бы более надежным, если бы у вас когда-либо были обновления от нескольких процессов (возможно, на разных клиентских узлах), но, возможно, если вы на 100% уверены, что этого никогда не произойдет, ваши идеи на основе Java-синхронизации могут повысить производительность. .. Я не буду угадывать так или иначе, но рекомендую вам измерять вещи обоими способами (, если вы готовы ставить свою рубашку никогда, никогда получать обновления от нескольких клиентов узлы, то есть; -).

`

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...