Сценарий
#!/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.
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();
}
}
});
}
Это похоже на открытую проблему в моем списке задач. У меня есть одна схема, разработанная в некоторой степени, но пока нет математических расчетов, подтверждающих это предложение.
Обновление и резюме: хотелось бы, чтобы коэффициент сглаживания (альфа) не зависел от коэффициента компенсации (который здесь я называю бета ). Отличный ответ Джейсона, уже принятый здесь, отлично подходит для меня.
Первый шаг.
Второй шаг.
Вам не нужно добавлять этот код - Spring может сделать это за вас.
Да 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
.
Spring может справитесь со всем этим за вас, используя @Transactional, как объяснено, или в XML, если хотите.
Правильно нужно импортировать тип Распространения транзакции , который зависит от вашего приложения.
По умолчанию транзакция будет запущена, если она не существует, и будет повторно использовать существующую транзакцию, если она уже была запущена. Это то поведение, которое вы хотите, если хотите, чтобы все 4 DAO были атомарными.
Поместите @Transactional в класс, который будет управлять методами DAO, называемыми (MyService) - все, что ниже этого уровня, теперь будет участвовать в этой границе транзакции.
то есть:
@Transactional
public void m1(Data data) {
...
}
@Transactional
public void m2(Data data) {
...
}
Делать это в коде совершенно не нужно.