Легкие транзакции с помощью Spring JDBC?

Сценарий

#!/bin/bash

# Commands found in the hash table are checked for existence before being
# executed and non-existence forces a normal PATH search.
shopt -s checkhash

function exists() {
 local mycomm=$1; shift || return 1

 hash $mycomm 2>/dev/null || \
 printf "\xe2\x9c\x98 [ABRT]: $mycomm: command does not exist\n"; return 1;
}
readonly -f exists

exists notacmd
exists bash
hash
bash -c 'printf "Fin.\n"'

Результат

✘ [ABRT]: notacmd: command does not exist
hits    command
   0    /usr/bin/bash
Fin.
9
задан informatik01 18 August 2017 в 13:52
поделиться

4 ответа

For completeness, the programmatic solution would be:

private TransactionTemplate transactionTemplate;

public setTransactionManager(PlatformTransactionManager transactionManager) {
  this.transactionTemplate = new TransactionTemplate(transactionManager);
}

...

while (true) {

  transactionTemplate.execute(new TransactionCallbackWithoutResult() {
    protected void doInTransactionWithoutResult(TransactionStatus status) {
      try {
        dao.m1(data1);
        dao.m2(data2);
        dao.m3(data3);
        dao.m4(data4);
      } catch(DbUpdateException e) {
        status.setRollbackOnly();
      }
    }
  });
}
8
ответ дан 4 December 2019 в 08:34
поделиться

Это похоже на открытую проблему в моем списке задач. У меня есть одна схема, разработанная в некоторой степени, но пока нет математических расчетов, подтверждающих это предложение.

Обновление и резюме: хотелось бы, чтобы коэффициент сглаживания (альфа) не зависел от коэффициента компенсации (который здесь я называю бета ). Отличный ответ Джейсона, уже принятый здесь, отлично подходит для меня.

Первый шаг.

  • Если вы также можете измерить время, прошедшее с момента взятия последней выборки (в округленных кратных вашему постоянному времени выборки - так что 7,8 мс с момента последней выборки) будет 8 единиц), которые можно использовать для многократного применения сглаживания. В этом случае примените формулу 8 раз. Вы фактически сделали сглаживание более смещенным в сторону текущего значения.

Второй шаг.

  • Чтобы добиться лучшего сглаживания, вы можете поместить эти вызовы в метод и указать свои транзакции декларативно .

    Вам не нужно добавлять этот код - Spring может сделать это за вас.

1
ответ дан 4 December 2019 в 08:34
поделиться

Да Spring позволяет вам программно управлять транзакциями .

Лично я предпочитаю декларативные транзакции с использованием аннотаций, которые выглядят следующим образом:

public void runBatchJob() {
  while (true) {
    // generate work
    doWork(unitOfWork);
  }
}

@Transactional
private void doWork(UnitOfWork work) {
  dao.m1(data1);
  dao.m2(data2);
  dao.m3(data3);
  dao.m4(data4);
}

где определены функции DAO:

@Transactional
public void m1(Data data) {
  ...
}

Это требуется в вашем applicationContext.xml :

<tx:annotation-driven/>

Декларативные транзакции могут быть объявлены как требующие транзакции, требующие новой транзакции, поддерживающие транзакции и т. д. Произойдет откат когда блок, помеченный @Transactional , выдает исключение RuntimeException .

15
ответ дан 4 December 2019 в 08:34
поделиться

Spring может справитесь со всем этим за вас, используя @Transactional, как объяснено, или в XML, если хотите.

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

По умолчанию транзакция будет запущена, если она не существует, и будет повторно использовать существующую транзакцию, если она уже была запущена. Это то поведение, которое вы хотите, если хотите, чтобы все 4 DAO были атомарными.

Поместите @Transactional в класс, который будет управлять методами DAO, называемыми (MyService) - все, что ниже этого уровня, теперь будет участвовать в этой границе транзакции.

то есть:

@Transactional
public void m1(Data data) {
 ...
}

@Transactional
public void m2(Data data) {
 ...
}

Делать это в коде совершенно не нужно.

См. здесь для получения дополнительной информации

1
ответ дан 4 December 2019 в 08:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: