ورود

View Full Version : استفاده صحیح از تراکنش



aliasghar
پنج شنبه 28 مهر 1384, 13:02 عصر
من در یک بانک اطلاعاتی بصورت زیر از Transaction استفاده کردم و حالا میخواهم بدونم اکه اصلا این کار صحیح است یا اشتباه


create procedure Detail(@Myvar dataType)
as
begin
if (condition = true)
begin Tran D1;

insrt To Mytable ...
if @@error <> 0 goto RB;
update MyTable ...
if @@error <> 0 goto RB;

if @@error <> 0
begin
RB:
print 'ERROR';
Rollback Tran D1;
Return(-1);
End Else
Begin
Print ' OK ';
Commit Tran D1;
Return (1);
End;
end

create procedure Master(@Myvar1 dataType,@MyVar2 datatype)
as
begin
Declare @RM_Detail;
begin Tran M1;

exec @RM_Detail = Detail X
if @RM_Detail = -1
begin
print 'error in execute proc datail';
goto RB;
end

Do eny thing and call another porcedure

if @@error <> 0
begin
RB:
print 'ERROR';
Rollback Tran M1;
Return(-1);
End Else
Begin
Print ' OK ';
Commit Tran M1;
Return (1);
End;
end



در application بیشتر پروسیجر Master را call میکنم ولی اگر در حین انجان آن مخصوصا در حیتن انجام پروسیجر detail دچار مشکل شود کلیه تراکنش ها را لغو کرده (یعنی حتی تراکنش Master هم Rollback میشود) و بعد هم
پیام می دهد مه تعداد تراکنش ها شما صحیح نیست

چرا؟

titbasoft
پنج شنبه 28 مهر 1384, 15:16 عصر
چون:

Naming multiple transactions in a series of nested transactions with a transaction name has little effect on the transaction. Only the first (outermost) transaction name is registered with the system. A rollback to any other name (other than a valid savepoint name) generates an error. None of the statements executed before the rollback are in fact rolled back at the time this error occurs. The statements are rolled back only when the outer transaction is rolled back

راه حل:

BEGIN TRAN T1
UPDATE table1 ...
BEGIN TRAN M2 WITH MARK
UPDATE table2 ...
SELECT * from table1
COMMIT TRAN M2
UPDATE table3 ...
COMMIT TRAN T1

AminSobati
دوشنبه 28 آذر 1384, 09:14 صبح
ضمن تایید پست قبلی، این نکته رو اضافه میکنم که وقتی یک SP اجرا میشه، تعداد Tranها، قبل از شروع SP و بعد از اتمان اون باید یکسان باشه. یعنی SP نباید در تعداد Tranها تغییر ایجاد کنه. مثلا اگر Rollback انجام بده، بعد از پایان SP تعداد Tranها کم شده (خطا!). یا اگر Tran جدید شروع کنه، بعد از پایان SP، تعداد Tranها افزایش پیدا کرده (باز هم خطا!).
اگر یک SP رو صدا میزنید، بهتره اون Rollback انجام نده. بلکه با Return Code به Caller بفهمونه که خطا رخ داده و Caller خودش Rollback انجام بده.
اینکه بعد از انجام هر ویرایش دارین مقدار ERROR@@ رو چک میکنین، روش کاملا درستیه

aliasghar
دوشنبه 28 آذر 1384, 17:47 عصر
یک دنیا ممنون