Механизм блокировки резьбы .NET Remoting - PullRequest
4 голосов
/ 23 января 2010

У меня острая проблема, и я надеюсь, что вы все можете мне помочь. Я приложу все усилия, чтобы объяснить это так хорошо, как смогу.

Я дополняю систему, в которой используется удаленное взаимодействие .NET, чтобы разрешить вызовы из базы данных с тонкого клиента на сервер, который выполняет указанные вызовы. На самом сервере установлены компоненты доступа к данным, поэтому он выполняет фактические вызовы базы данных и просто возвращает данные для тонкого клиента.

Я недавно добавил транзакции в эти модули. Я хотел сделать этот потокобезопасным, когда клиентский поток A запускает транзакцию базы данных, клиентский поток B не сможет получить доступ к транзакции клиентского потока A. В то же время нет необходимости разрешать клиентскому потоку B иметь собственную транзакцию, необходимо только, чтобы я не позволял клиентскому потоку B использовать транзакцию клиентского потока A.

Существует только одна ссылка на удаленный объект, который они оба разделяют, и из-за базовой архитектуры, в которую я не буду входить, я не могу изменить это. Все объекты транзакций хранятся на сервере в этом удаленном объекте.

Я не вижу хорошего способа сделать это, кроме, возможно, передачи информации о клиентском потоке вместе с каждым вызовом транзакции, что невозможно при моих срочных графиках. :-( Возможно, если удаленный объект сможет получить доступ к вызывающему клиентскому потоку, тогда мне не придется передавать информацию о потоках при каждом вызове, делая это возможным.

Если бы был какой-то способ связать поток клиента с потоком процесса удаленного взаимодействия, я думаю, что это бы сработало, но нет документации, которую я мог бы найти по этому поводу.

Надеюсь, я объяснил это достаточно хорошо. Вся помощь очень ценится. Заранее спасибо.

Ответы [ 2 ]

2 голосов
/ 23 января 2010

Я не уверен на 100%, можно ли это сделать, но использование CallContext может помочь.В двух словах, CallContext - это внеполосные данные, которые могут быть удалены на сервер, см. Этот блог здесь для примера.Если вы не понимаете, что такое Out-Of-Band (oob), посмотрите здесь в Википедии.Вот еще один конкретный пример здесь .Это может дать вам ключ.

1 голос
/ 23 января 2010

То, что ты пытаешься сделать, звучит немного странно, поэтому дай мне посмотреть, пойму ли я:

  • Вы используете синглтон на стороне сервера, поэтому у каждого клиента есть только 1 поток на сервере.

  • Предполагая, что процесс транзакции занимает много времени (от секунд до минут), другие клиенты ДОЛЖНЫ дождаться завершения первого клиента.

Я думаю, но я не уверен, что каждый клиентский вызов создает свой собственный поток. Если это так, то просто реализуйте некоторые вызовы «блокировки», когда удаленный объект должен выполнять вызовы, ориентированные на поток. Блокировка обходится дорого, и если транзакция занимает секунды, то другой ожидающий может истечь (eeK!)

Это такие вещи, для которых объект TransactionScope был создан для (см. MSDN) . Я больше не могу помочь, не зная больше об арке решения.

Извините ... Я не знаю, полезно это или нет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...