Собирают ли транзакции запросы к базе данных или блокируют ее до фиксации? - PullRequest
0 голосов
/ 20 декабря 2010

Предположим, этот фрагмент кода Hiberante:

session.beginTransaction();
Event event1 = session.load(1);
Event event2 = new Event(2);
event2.setNextEvent(event1);
event2.save();
session.getTransaction().commit();

Мой вопрос: работает ли он так, как ожидалось?То есть я могу что-то прочитать из базы данных, установить ее для другой сущности, а затем сохранить эту сущность в базе данных в одной транзакции?все запросы к базе данных и удерживайте их, пока вы не скажете мне их зафиксировать. "orr действительно означает только блокировка, а фиксация означает разблокировку?

1 Ответ

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

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

Если предположить, что a не было зафиксировано в базе данных, то dao.findBar(a) все равно вернет его, потому что он будет в кеше гибернатов.Предполагая, что он был связан с сеансом гибернации в первую очередь.

dao.findBar(a) должен вернуть x, при условии, что он соответствует тем же критериям, что и a.то есть, что он уже существует или был связан с сеансом гибернации.

Таким образом, поэтому dao.findBar(x.getBaz()) также должен работать, предполагая то же самое.

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

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

...