Несколько потоков, обращающихся к базе данных: один с длинной транзакцией, другой с короткими транзакциями - PullRequest
5 голосов
/ 20 декабря 2010

Допустим, у меня есть настольное приложение, которое действует как гараж для нескольких машин:

@Entity
public class Garage {
    private List<Car> cars = new ArrayList<Car>();
    ...
}

В настольном приложении есть кнопка «симуляция», которая запускает новый поток и начинает вызывать методы дляГараж, Автомобиль, Колесо и т. Д. Эта симуляция может занять до 10 минут.На данный момент у меня есть класс, который выглядит следующим образом:

beginTransaction();
Garage garage = garageDao.findGarage(1);
List<Car> cars = garage.getCars();
for (Car car : cars) {
    // call methods on the car to lazily fetch other things like wheels...
}
commitTransaction();

Этот код только «читает» и никогда не «пишет»

Так что приведенное выше может занять много времени в зависимости от того, каксильно автомобили нуждаются в обслуживании.В то время как вышеупомянутое случается, пользователь может продолжить работать, используя настольное приложение.Они могут изменить цвет автомобиля, который используется в вышеуказанной транзакции.

Мой вопрос заключается в том, собирается ли указанная выше длинная транзакция предотвратить изменение цвета автомобиля?то есть пользователь, изменяющий цвет автомобиля в настольном приложении, не сможет зафиксировать изменение, пока не завершится длинная транзакция?

Ответы [ 3 ]

4 голосов
/ 20 декабря 2010

С чего бы это?По умолчанию вы используете оптимистичные транзакции, поэтому блокировка для чтения строк не применяется (если вы не показываете нам некоторые вызовы JPA2 lock ()).При фиксации транзакции следует проверить оптимистическую версию записей (если вы определили версию) и использовать ее, чтобы решить, следует ли фиксировать изменения.

0 голосов
/ 20 декабря 2010

Как указано выше:

Обычно операции только для чтения не должны блокировать операции записи в базе данных.Таким образом, ваш длинный поток чтения не должен блокировать короткие операции записи.

Я полагаю, что можно настроить уровень изоляции для вашей базы данных, а соединение, которое может блокировать запись с помощью операторов длинного чтения, но это НЕ по умолчаниюна любом из типов баз данных, которые я знаю.

0 голосов
/ 20 декабря 2010

Ответ, скорее всего, будет зависеть от того, какую базу данных вы используете, и более важно, какой уровень изоляции транзакции.

Но ответ, как правило, нет: они не должны блокироваться (но, как я уже сказал, зависят от базы данных и уровня транзакций).

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