۱۳۸۸/۱۱/۰۱

سرورهاي متصل شده‌ي SQL Server و مبحث تراكنش‌ها


يكي از قابليت‌هاي جالب SQL Server در يك شبكه محلي امكان link و اتصال آن‌ها به يكديگر است. به اين صورت امكان كوئري گرفتن (و يا اعمال متداول SQL ايي) از دو يا چند سرور مختلف با دستورات T-SQL ميسر مي‌شود؛ به نحوي كه حس يكپارچگي ديتابيس‌هاي اين سرورها را حين كوئري نوشتن خواهيم داشت.
براي مثال فرض كنيد دو سرور SQL1 و SQL2 را در شبكه داريم. مي‌خواهيم در سرور SQL1 اتصالي را به سرور SQL2 ايجاد كنيم.

USE master

EXEC sp_addlinkedserver
'SQL2',
N'SQL Server'

sp_addlinkedsrvlogin @useself='false ', @rmtsrvname = 'SQL2',
@rmtuser = 'sa',
@rmtpassword = 'pass#'

دستورات T-SQL فوق كار ثبت يك liked server جديد و اعمال مشخصات كاربري كه توسط آن قرار است به سرور SQL2 دسترسي داشت، انجام مي‌دهند.
اكنون جهت بررسي اين اتصال در سرور SQL1 كوئري زير را اجرا مي‌كنيم:

select * from sql2.faxManager.dbo.tblErja

كه نحوه‌ي فراخواني جدول مورد نظر بايد به صورت Server.DatabaseName.dbo.TableName در آن رعايت شود.
تا اينجا همه چيز خوب است. مشكل از زماني شروع مي‌شود كه بخواهيم تراكنش‌ها را نيز دخالت دهيم و اصولي كار كنيم. براي مثال:

begin distributed tran
select * from sql2.faxManager.dbo.tblErja
commit tran

خطايي كه در ويندوز سرور 2003 با آخرين به روز رساني‌ها ظاهر مي‌شود به صورت زير است:

The operation could not be performed because OLE DB provider for linked server was unable to begin a distributed transaction.
OLE DB provider for linked server returned message "The partner transaction manager has disabled its support for remote/network transactions.".


به صورت پيش فرض اين نوع تراكنش‌هاي توزيع شده غيرفعال هستند مگر اينكه فعال شوند و روش حل مشكل نيز به صورت زير مي‌باشد:
قبل از هر كاري به كنسول سرويس‌هاي ويندوز مراجعه كرده و از در حال اجرا بودن سرويس Distribute Transaction Coordinator اطمينان حاصل كنيد.
سپس به قسمت زير مراجعه نمائيد:
Control Panel > Administrative Tools > Component Services


نود مربوط به Component Service را گشوده و سپس بر روي My Computer كليك راست كرده و گزينه‌ي خواص را انتخاب كنيد.
در صفحه‌ي بازه شده به برگه‌ي MSTDC مراجعه كرده و بر روي دكمه‌ي Security Configuration كليك نمائيد.
اكنون تنظيمات آن‌را مطابق شكل زير تغيير دهيد.


اين تنظيم بايد بر روي هر دو سرور SQL1 و SQL2 انجام شود.

پس از اين تغييرات كه شامل راه اندازي مجدد سرويس Distribute Transaction Coordinator نيز خواهد شد، مشكل خطاي فوق برطرف شده و امكان استفاده از تراكنش‌ها در linked servers نيز ميسر مي‌شود.

مشكل ديگري كه به آن برخوردم خطاي زير است:

Unable to start a nested transaction for OLE DB provider for linked server . A nested transaction was required because the XACT_ABORT option was set to OFF.
OLE DB provider for linked server returned message "Cannot start more transactions on this session.".


براي حل اين مشكل يك سطر زير را بايد به ابتداي كوئري خود اضافه كرد كه جزو الزامات تراكنش‌هاي توزيع شده است و به اين صورت از rollback كامل تمامي دستورات موجود فراخواني شده T-SQL در صورت بروز كوچكترين خطايي اطمينان حاصل مي‌كند:
SET XACT_ABORT ON


براي مطالعه بيشتر:
MSDTC Troubleshooting