Вопрос проектирования транзакций базы данных - PullRequest
0 голосов
/ 22 марта 2011

Рассмотрим следующие два блока псевдокода Java в системе, которая использует оптимистичные транзакции.

Пример A :

try {
    txn.begin();
    // database operations
    txn.commit();
}
catch (Exception e) {
    txn.rollback();
}

Пример B

txn.begin();
// database operations
try {
    txn.commit();
}
catch (Exception e) {
    txn.rollback();
}

В нашем коде транзакции выполняются в обоих направлениях; Я уверен, что A правильно. моя интуиция говорит мне, что B не так, но кажется, что в B нет никакого вреда, поскольку commit() находится в блоке try, и его можно поймать и откатить в случае ошибки. Пожалуйста, объясните, является ли B правильным и почему. Спасибо!

Редактировать : То есть я не получаю ответ, который ищу. Я уже знаю , что B как-то "плохо", я ищу , почему это плохо; то есть, есть ли возможная ситуация, когда A будет работать, где B не получится?

-tjw

Ответы [ 2 ]

1 голос
/ 22 марта 2011

Я бы сделал небольшую смесь (Пример C):

txn.begin(); 
try {
    // database operations
    txn.commit();
}
catch (Exception e) {
    txn.rollback();
}

Сохраните команды базы данных в блоке try, но не включайте транзакцию begin.Если вы допустите ошибку «begin», вы не попытаетесь откатить транзакцию, которая никогда не была запущена в блоке catch.

Редактировать

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

0 голосов
/ 22 марта 2011

Ну, в B вы бы не откатили транзакцию, если перед фиксацией произошла ошибка .Вы также не делаете коммит, по крайней мере, не в этом куске кода, но, может быть, позже, случайно?Кажется, лучше зафиксировать или откатить как можно раньше, и не оставлять транзакцию в ожидании некоторой очистки, которая, как мы надеемся, произойдет позже.

Было бы сказано, что это проблема с B .

Кроме того, в зависимости от вашей системы вам могут потребоваться блоки наконец и для правильного снятия транзакции.

...