Мое понимание JobStoreCMT заключается в том, что вы объявляете все свои транзакции, используя классы в пространстве имен System.Transactions, которое было представлено в .NET 2.0. К счастью, NHibernate хорошо работает и с этими транзакциями, поэтому вы можете поместить свои операции Quartz и NHibernate в одну TransactionScope, как показано ниже:
using (var ts = new TransactionScope()) {
// do something with your scheduler here, eg
_scheduler.ScheduleJob(someJobDetail, someTrigger);
// create an NHibernate session that will be part of the same transaction
using (var session = _sessionFactory.OpenSession()) {
// perform actions on session here, but do *not* make use of
// NHibernate transaction methods, such as ISession.BeginTransaction(),
// because the transaction is controlled via the TransactionScope instance.
}
ts.Complete();
}
Приведенный выше код предполагает, что в другом месте следующие переменные объявлены и инициализированы:
Quartz.IScheduler _scheduler;
NHibernate.ISessionFactory _sessionFactory;
Приведенный выше пример кода не содержит подробностей, но это общая идея.
Одна проблема, с которой вы можете столкнуться, заключается в том, что для приведенного выше кода потребуется распределенная транзакция, поскольку класс Quartz JobStoreCMT создает одно соединение с базой данных, а сеанс NHibernate создает другое соединение с базой данных. Хотя возможно (по крайней мере, для SQL Server) иметь два разных подключения к базе данных, использующих одну и ту же транзакцию, я понимаю, что текущая реализация System.Transactions обновит транзакцию до распределенной транзакции с открытием второго соединения. Это существенно повлияет на производительность, поскольку распределенная транзакция значительно медленнее, чем простая транзакция.