Мне не совсем понятно, что делают транзакции в системах баз данных. Я знаю, что они могут быть использованы для полного отката списка обновлений (например, вычитайте деньги на одной учетной записи и добавьте их в другую), но это все, что они делают? В частности, можно ли их использовать для предотвращения условий гонки? Например:
// Java/JPA example
em.getTransaction().begin();
User u = em.find(User.class, 123);
u.credits += 10;
em.persist(u); // Note added in 2016: this line is actually not needed
em.getTransaction().commit();
(Я знаю, что это, вероятно, может быть написано как один запрос на обновление, но это не всегда так)
Защищен ли этот код от условий гонки?
Меня больше всего интересует MySQL5 + InnoDB, но общие ответы также приветствуются.