Есть приложение, которое запускает транзакцию на SQL Server 2008 и перемещает некоторые данные. Затем, пока транзакция еще не зафиксирована, приложение распечатывает некоторые метки. Очень важно, чтобы транзакция не была зафиксирована до тех пор, пока печать не будет выполнена успешно; если происходит ошибка печати, все откатывается.
Теперь, механизм печати а) вырос довольно громоздким и сложным, и б) в конечном итоге требуется из многих мест. Поэтому принято решение отделить двигатель и сделать его обслуживающим.
Да, можно передать все данные, необходимые для печати, из клиентского приложения на этот сервер, чтобы сервер печатал только и не заботился о базах данных. Тем не менее, это будет означать, что в каждом приложении, которое требует печати, остаются груды кода и шаблоны этикеток; фактически тогда произойдет очень небольшое разделение. Напротив, было бы чрезвычайно эффективно (и мне было бы легче писать и поддерживать) просто передавать идентификаторы того, что требуется службе, которая затем направлялась бы в базу данных и получала данные. Все форматы и макеты будут централизованы, и приложения будут запрашивать только 5 накладных из задания на печать 12345.
Теперь этого не произойдет, поскольку транзакция еще не зафиксирована на момент печати. Служба не сможет прочитать данные, и использование READ UNCOMMITTED не совсем вариант.
Я собирался использовать старый добрый sp_bindsession
, чтобы присоединиться к двум сеансам, приложениям и сервисам, но затем он внезапно устарел и будет удален из будущих выпусков. В справке предлагается использовать вместо этого MARS или распределенные транзакции, но я не понимаю, как они могут помочь.
Любой совет?