PDA

View Full Version : INSERT و UPDATE در يك Transaction



A.Farzin
شنبه 02 آذر 1387, 18:59 عصر
با سلام

من ميخواهم روي يك جدول ابتدا يك Insert و بعداً يك Update انجام دهم اگر هر دو دستور INSERT و UPDATE را داخل يك BEGIN TRAN و COMMIT TRAN قرار دهم، آيا اين دو دستور يك Transaction محسوب خواهد شد يا نه؟

علت سئوال:
روي اين جدول يك TRIGER AFTER INSERT هست و يك TRIGER AFTER UPDATE هر دوي اين تريگرها يك SP واحد را اجرا مي‌كنند. در حال حاضر اين SP دو مرتبه اجرا مي‌شود در صورتي كه يك مرتبه آن (فقط اجرا بعد از UPDATE) برايم كافيست. مشكل هم آنجاست كه نمي‌توانم TRIGER AFTER INSERT را كلاً بردارم چون نياز دارم در حالات ديگري كه INSERT‌انجام ميشود، تريگر اجرا شود.
ميخواستم ببينم آيا ميشود اين دو دستور رت طوري با هم وارد كرد كه فقط يا insert‌ محسوب شود و يا update؟
ممنون

AminSobati
شنبه 02 آذر 1387, 21:34 عصر
سلام دوست عزیزم،
هر عملی که در Trigger انجام بدین، زیر مجموعه Transactionی قرار میگیره که اساسا باعث اجرای Trigger شده. همچنین اگر دستورات شما داخل BEGIN TRAN و COMMIT TRAN یکسان قرار بگیرند، هر دوی اونها زیر مجموعه یک Transaction خواهند بود و Commit یا Rollback شدنشون با هم هست.
متاسفانه قسمت آخر سوالتون برام واضح نبود

A.Farzin
شنبه 02 آذر 1387, 22:27 عصر
به اعمال داخل تريگر كاري ندارم. منظورم اعمالي است كه باعث اجراي تريگر شده‌اند. چون يك مرتبه insert انجام ميشود و مرتبه ديگر update و جدا بودن اين دو Transaction باعث دوبار اجراي SP ميشود به دنبال اين هستم كه كاري كنم تا پس از انجام دو عمل Insert و Update فقط يكبار تريگر ياد شده اجرا شود.
به نظرم ميرسد كه اگر اين دو transaction يكي شوند پس تريگر يكبار اجرا خواهد شد.
ممنونم

AminSobati
شنبه 02 آذر 1387, 23:56 عصر
منطقی که هم در Update Trigger و هم در Insert Trigger تکرار شده این رو میرسونه که هر دوی اونها لازم الاجرا هستند. اگر به هر دلیلی باید یکیش اجرا بشه:
1) یا این منطق رو از Trigger خارج کنید و خودتون فراخوانی کنید
2) یا در Trigger اول، یک Flag جایی Set کنید و در Trigger دوم اون Flag رو چک کنید. در این حالت شاید لازم بشه با کمک sp_SetTriggerOrder ترتیب اجرای Triggerها رو در دست بگیرید

A.Farzin
یک شنبه 03 آذر 1387, 19:35 عصر
علت اينكه ميخواهم يكي از تريگرها بيشتر اجرا نشود به خاطر بروز مشكل همزماني است. شايد با دانستن زمان دقيق شروع اجراي يك تريگر INSTEAD OF بشود مشكل را حل كرد. من به راستي نميدانم كه تريگر INSTEAD OF كي اجرا ميشود:
به مثال زير نگاه كنيد. اگر روي View1 يك تريگر Instead of قرار داشته باشد و دستور زير روي اين View صادر شود، تريگر در چه زماني شروع به اجرا خواهد كرد:

1- BEGIN TRAN
2- INSERT INTO View1 .....
3- INSERT INTO View1 .....
4- COMMIT TRAN

1) به محض اجراي BEGIN TRAN و قبل از اجراي Transactionها (يعني پس از جراي خط 1)
2) به محض اجراي اولين Transaction (يعني پس از جراي خط 2)
3) پس از اتمام اجراي Transactionها (يعني پس از اجراي خط 3)
4) به محض اجراي COMMIT TRAN (يعني پس از خط 4)

AminSobati
یک شنبه 03 آذر 1387, 23:54 عصر
وقتی دستور INSERT صادر میشه، قبل اینکه روی جدول تاثیر بگذاره Trigger اجرا میشه و اگر در Trigger شما INSERT رو تکرار کنین اونوقت روی جدول تاثیر خواهد گذاشت

A.Farzin
دوشنبه 04 آذر 1387, 18:23 عصر
يعني دستور فوق باعث خواهد شد تا تريگر 2 مرتبه اجرا شود
يكبار در ابتداي insert اول و يكبار در ابتداي insert دوم

ممنونم از راهنمائيتان