PDA

View Full Version : Lock Monitor



sia_2007
یک شنبه 01 آذر 1388, 15:33 عصر
سلام دوستان
احساس من اینه که اگه این بخش از کار تموم بشه یه کد حسابی برای استفاده در برنامه ها به دست میآد :
دوستان هول نکنید؛ این کدها جنراله؛ تو سیستمتون بزنیدشون؛ بهتون نتیجه میده.
لازم نیست خود کد رو بخونید؛ من اصلا تو خود کد مشکلی ندارم.
ببینید من یک چنین کدی دارم :

SELECT
[Session ID] = s.session_id,
[IS User Process ?] = CONVERT(CHAR(1), s.is_user_process),
[Login] = s.login_name,
[Database] = ISNULL(db_name(p.dbid), N''),
[Application] = ISNULL(s.program_name, N''),
= ISNULL(CONVERT (varchar, w.blocking_session_id), ''),
[Head Blocker] =
CASE
-- session has an active request, is blocked, but is blocking others or session is idle but has an open tran and is blocking others
WHEN r2.session_id IS NOT NULL AND (r.blocking_session_id = 0 OR r.session_id IS NULL) THEN '1'
-- session is either not blocking someone, or is blocking someone but is blocked by another party
ELSE ''
END,
[Wait Type] = ISNULL(w.wait_type, N'')

FROM sys.dm_exec_sessions s LEFT OUTER JOIN sys.dm_exec_connections c ON (s.session_id = c.session_id)
LEFT OUTER JOIN sys.dm_exec_requests r ON (s.session_id = r.session_id)
LEFT OUTER JOIN sys.dm_os_tasks t ON (r.session_id = t.session_id AND r.request_id = t.request_id)
LEFT OUTER JOIN
(
SELECT *, ROW_NUMBER() OVER (PARTITION BY waiting_task_address ORDER BY wait_duration_ms DESC) AS row_num
FROM sys.dm_os_waiting_tasks
) w ON (t.task_address = w.waiting_task_address) AND w.row_num = 1
LEFT OUTER JOIN sys.dm_exec_requests r2 ON (s.session_id = r2.blocking_session_id)
LEFT OUTER JOIN sys.dm_resource_governor_workload_groups g ON (g.group_id = s.group_id)
LEFT OUTER JOIN sys.sysprocesses p ON (s.session_id = p.spid)
ORDER BY S.session_id



----


به علاوه چنین کدی :


[B]SELECT SS.name FROM sys.objects AS SS



---

حال میخواهم بین این 2 Join بزنم و لامصب مشکل همین جاست :

اولی یه فیلدی داره به نام season id و دومی فیلدی داره به نام ObjectID
حال اگه بخوام یه Join منطقی بین این دو تا بزنم باید این دو تا فیلد رو به هم وصل کنم.

تا این جای کار هیچ مشکلی نیست.

مشکل اینه که اون به اصطلاح دیتایی که هم توش ObjectID هست و هم SeasonID تو چنین دستوریه :


EXEC sp_lock


چه جوری میشه بین این 3 تا کد Join برقرار کرد ؟
راهنمایی کردم؛ کلید اولی و دومی در این سومی هست.
دوستان کمک کنید؛
واقعا اگه همین یه ذرش حل بشه تمومه
میشه فهمید چه لاگینی با چه پراسسی و تحت کدوم دیتابیسی کدوم آبجکت رو گرفته و چه لاکی روش قرار داده؛
و هم چنین کی بن بست درست کرده؛ و کی علاف کیه.
ممنون میشم از همتون

AminSobati
یک شنبه 01 آذر 1388, 23:08 عصر
سلام دوست عزیزم،
حدس میزنم چیزی مثل این رو میخواین:

select * from sys.dm_tran_locks

Reza.ariyan
دوشنبه 02 آذر 1388, 01:09 صبح
مشکل اینه که اون به اصطلاح دیتایی که هم توش ObjectID هست و هم SeasonID تو چنین دستوریه :


EXEC sp_lock


دوست عزیز من خیلی دنبال این بودم که خروجی EXEC یا خروجی اجرای SP ها و .. رو تو برنامم استفاده کنم
ولی به این نتیجه رسیدم که نمیشه
ولی امروز خیلی اتفاقی با Syntax اسکریپت نویسی Oracle اومدم یه چیزی نوشتم - تا f5 رو زدم یهو ترکیدم
دیدم که اجرا شد (از خوشحالی بال در اوردم) ها ها ها





برای استفاده از خروجی sp یا هر خروجی که EXEC و EXECUTE به ما میده باید اول خروجی رو ذخیره کنیم و بعد استفاده کنیم
مثلا :




CREATE TABLE ErrorLoging
(
LogDate DATETIME,
ProcessInfo NVARCHAR(50),
Text NTEXT
)
INSERT INTO ErrorLoging
EXEC master..xp_readerrorlog

SELECT *
FROM ErrorLoging



تو این مثال من از خروجی EXEC master..xp_readerrorlog استفاده کردم و تو table ریختم
شما برای استفاده از خروجی EXEC میتونید از این راه استفاده کنید . با این تفاوت که به جای ساختن Table باید یه متغییر تیبلی یا یک Temp Table بسازی و داده های خروجی EXEC داخلش بریزی و استفاده کنی

sia_2007
دوشنبه 02 آذر 1388, 17:03 عصر
دوست عزیز
متاسفانه این دستور
select * from sys.dm_tran_locks
حاوی ObjectID نیست
ولی صمیمانه از راهنمایی تان تشکر میکنم.

sia_2007
دوشنبه 02 آذر 1388, 18:07 عصر
هر چند که مشکل من هنوز حل نشده؛
یعنی انجام شد؛ ولی Join ها جواب نداد.
ولی دستور العمل شما بسیار کاربردی بود.
از همه تان ممنونم

AminSobati
دوشنبه 02 آذر 1388, 23:03 عصر
select OBJECT_NAME(resource_associated_entity_id ), * from sys.dm_tran_locks
where resource_type='object'