を休止:コンテナが管理している私たちが望むすべての場合においてマルチテナンシー、我々は4.3マルチテナント、hikaricp接続プロバイダ休止状態を使用している4.3、Wildfly 9、Hikaricpの自動コミットEJB3 JTAコンテナ管理によるトランザクションを持つ偽モードとDAO
<property name="hibernate.multiTenancy" value="DATABASE"/>
<property name="hibernate.multi_tenant_connection_provider" value="multitenancy.HikariTenantConnectionProvider"/>
<property name="hibernate.tenant_identifier_resolver" value="multitenancy.ThreadLocalIdentifierResolver"/>
を私たちのトランザクションは、java ee ejb standardを使用しています。
問題:
自動コミット
オートモードでのコミット処理次は起こる私たちは、DAOパターンvoucherServiceで次のコードしていることを言うことができます:
@TransactionAttribute(TransactionAttributeType.MANDATORY)
private Voucher save(Voucher entity, Boolean isCreate) throws Exception {
voucherPoolService.save(entity);
List<VoucherTag> tags = _detachTags(entity);
List<VoucherCaption> captions = _detachCaptions(entity);
if (isCreate) {
voucherDAO.save(entity);
} else {
voucherDAO.merge(entity);
}
retailerService.updateTime(entity);
_clearCollections(entity);
_attachTags(entity, tags);
_attachCaptions(entity, captions);
voucherDAO.merge(entity);
return entity;
}
休憩コール:
@POST
@Transactional(value = Transactional.TxType.REQUIRES_NEW, rollbackOn = {Exception.class})
public Voucher create(Voucher entity) throws Exception {
if (getValidator() != null) {
getValidator().validateCreate(entity);
}
return getService().save(entity, true); // create
}
を
自動コミットモードでの処理方法:
CONTAINER - > JTAトランザクション - > JDBC
START TRANSACTION;
INSERT INTO voucher_pool ...
COMMIT;
START TRANSACTION;
INSERT INTO voucher ...
COMMIT;
START TRANSACTION;
INSERT INTO retailer ...
COMMIT;
START TRANSACTION;
INSERT INTO voucher_tags ...
COMMIT;
START TRANSACTION;
INSERT INTO voucher_tags ...
COMMIT;
は問題:
エンティティサービスの一つがライン上に例えばSQL例外をスローする場合:
retailerService.updateTime(entity);
JTAトランザクションAPIだろうか?ロールバックすると、ロールバックする方法はありません。
START TRANSACTION;
INSERT INTO voucher_pool ...
COMMIT;
START TRANSACTION;
INSERT INTO voucher ...
COMMIT;
あなたは既に別のJDBCトランザクションとしてデータベースにコミットされているためです。 これをうまく処理するにはどうすればよいですか?