package core.framework.impl.db; import core.framework.api.db.Transaction; import core.framework.api.log.Markers; import core.framework.api.util.StopWatch; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * @author neo */ final class TransactionImpl implements Transaction { private final Logger logger = LoggerFactory.getLogger(TransactionImpl.class); private final TransactionManager transactionManager; private final StopWatch watch = new StopWatch(); private final long longTransactionThresholdInNanos; TransactionImpl(TransactionManager transactionManager, long longTransactionThresholdInNanos) { logger.debug("begin transaction"); this.transactionManager = transactionManager; this.longTransactionThresholdInNanos = longTransactionThresholdInNanos; } @Override public void rollback() { transactionManager.rollbackTransaction(); } @Override public void commit() { transactionManager.commitTransaction(); } @Override public void close() { try { transactionManager.endTransaction(); } finally { long elapsedTime = watch.elapsedTime(); logger.debug("end transaction, elapsedTime={}", elapsedTime); if (elapsedTime > longTransactionThresholdInNanos) { logger.warn(Markers.errorCode("LONG_TRANSACTION"), "long db transaction, elapsedTime={}", elapsedTime); } } } }