EXECUTE এর পরে লেনদেনের গণনাটি বিগইন এবং কমিট স্টেটমেন্টগুলির মিলহীন সংখ্যা নির্দেশ করে। পূর্ববর্তী গণনা = 1, বর্তমান গণনা = 0


95

আমার কাছে একটি Insertসঞ্চিত পদ্ধতি রয়েছে যা ডেটা ফিড করবে Table1এবং এর Column1থেকে মান পাবে Table1এবং দ্বিতীয় সঞ্চিত প্রক্রিয়াটি কল করবে যা টেবিল 2 সরবরাহ করবে।

তবে আমি যখন দ্বিতীয় সঞ্চিত প্রক্রিয়াটিকে কল করি তখন:

Exec USPStoredProcName

আমি নিম্নলিখিত ত্রুটি পেয়েছি:

EXECUTE এর পরে লেনদেনের গণনাটি বিগইন এবং কমিট স্টেটমেন্টগুলির মিলহীন সংখ্যা নির্দেশ করে। পূর্ববর্তী গণনা = 1, বর্তমান গণনা = 0।

আমি এই জাতীয় অন্যান্য প্রশ্নের উত্তরগুলি পড়েছি এবং কমিটের গণনাটি ঠিক কোথায় গণ্ডগোল হয়ে যাচ্ছে তা সন্ধান করতে অক্ষম।


আপনার পদ্ধতিতে কি কোনও ট্রাই / ক্যাচ ব্লক রয়েছে?
রিমাস রুসানু

হ্যাঁ আমার কাছে ট্রাই / ক্যাচ ব্লক আছে
বিগনেশ কুমার এ

উত্তর:


110

আপনার যদি ট্রাই / ক্যাচ ব্লক থাকে তবে সম্ভাব্য কারণটি হ'ল আপনি কোনও লেনদেন বাতিল বিসর্জন ব্যতিক্রম ধরছেন এবং চালিয়ে যান। ক্যাচ ব্লকে আপনাকে অবশ্যই সর্বদা পরীক্ষা করা উচিত XACT_STATE()এবং যথাযথ বাতিল হওয়া এবং আপত্তিজনক (ডুমডড) লেনদেন পরিচালনা করতে হবে। যদি আপনার কলার কোনও লেনদেন শুরু করে এবং কালী আঘাত করে, বলুন, একটি অচলাবস্থা (যা লেনদেনটি বাতিল করে দিয়েছিল), কলি কীভাবে কলকারীর সাথে যোগাযোগ করতে চলেছে যে লেনদেনটি বাতিল ছিল এবং এটি 'যথারীতি ব্যবসা'তে চালিয়ে যাওয়া উচিত নয়? একমাত্র সম্ভাব্য উপায় হ'ল একজন ব্যতিক্রমকে নতুন করে উত্থাপন করা, কলারকে পরিস্থিতি সামাল দিতে বাধ্য করে। যদি আপনি নিঃশব্দে কোনও বাতিল হওয়া লেনদেন গ্রাস করেন এবং কলকারী ধরেই নিচ্ছেন যে মূল লেনদেনে এখনও রয়েছে তবে কেবল মারামারিই নিশ্চিত করতে পারে (এবং যে ত্রুটি আপনি পেয়েছেন সেটি ইঞ্জিন নিজেকে রক্ষার চেষ্টা করার উপায়)।

আমি আপনাকে ব্যতিক্রম হ্যান্ডলিং এবং নেস্টেড লেনদেনগুলি ছাড়িয়ে যাওয়ার পরামর্শ দিচ্ছি যা এমন প্যাটার্ন দেখায় যা নেস্টেড লেনদেন এবং ব্যতিক্রমগুলির সাথে ব্যবহার করা যেতে পারে:

create procedure [usp_my_procedure_name]
as
begin
    set nocount on;
    declare @trancount int;
    set @trancount = @@trancount;
    begin try
        if @trancount = 0
            begin transaction
        else
            save transaction usp_my_procedure_name;

        -- Do the actual work here

lbexit:
        if @trancount = 0
            commit;
    end try
    begin catch
        declare @error int, @message varchar(4000), @xstate int;
        select @error = ERROR_NUMBER(), @message = ERROR_MESSAGE(), @xstate = XACT_STATE();
        if @xstate = -1
            rollback;
        if @xstate = 1 and @trancount = 0
            rollback
        if @xstate = 1 and @trancount > 0
            rollback transaction usp_my_procedure_name;

        raiserror ('usp_my_procedure_name: %d: %s', 16, 1, @error, @message) ;
    end catch
end
go

4
আপনার সাহায্যের জন্য ধন্যবাদ. রাইজারার ব্যবহার করে আমি সমস্যাটি পেয়েছি t এটি নট নীল ক্ষেত্রের মধ্যে নূন্যতম মান toোকানোর চেষ্টা সম্পর্কে
বিগ্নেশ কুমার এ

তবে একটি সীমাবদ্ধ চেকের বৈধতা লেনদেনকে বাতিল করবে না। আপনি স্পষ্টভাবে ধরা পরে ঘুরছেন, বা আপনি ব্যবহার xact_abort on?
রেমাস রুসানু

আমি স্পষ্টতই
ঘুরছি

4
আমি এই প্যাটার্নটি চেষ্টা করেছি কিন্তু এখনও এটি কার্যকর হয় না - যখন আমার কাছে বাহ্যিক লেনদেন হয় তখন এই প্যাটার্নটি একটি সেভপয়েন্ট তৈরি করে এবং একটি সমালোচনামূলক ত্রুটির ক্ষেত্রে (আপত্তিজনক লেনদেন) বাইরের লেনদেনকে রোলব্যাক করে - এটি প্রবেশের আগে এখনও একটি @@ ট্রান্সকাউন্ট = 1 তৈরি করে প্রক্রিয়া এবং @@ ট্রান্সকাউন্ট = 0 থেকে বেরিয়ে যাওয়ার সময়
স্প্যারো

4
আমি মনে করি ক্যাচ-এর এই বিটটি ভুল: if @xstate = -1 rollback; এই এমএসডিএন উদাহরণটির দিকে তাকালে আমাদের যদি কোনও বাহ্যিক লেনদেন না ঘটে ( তবে এটি না করা পর্যন্ত) সম্পূর্ণ লেনদেনটি রোলব্যাক করা উচিত নয় । আমি মনে করি যে প্রক্রিয়াটি কেবলমাত্র যদি আমরা লেনদেন শুরু করি তবে এটি @ স্প্রোর সমস্যার সমাধান করবে। begin tranrollback
নিক

62

আমারও এই সমস্যা ছিল আমার জন্য কারণটি আমি করছিলাম

return
commit

পরিবর্তে

commit
return   

একটি সঞ্চিত পদ্ধতিতে।


4
@ সেগুসো - এটি খুব সহায়ক ছিল। ভাগ করার জন্য আপনাকে ধন্যবাদ। কখনও কখনও কিছু সাধারণভাবে ধুলার নীচে পায়। 'এম এর সেরা হয়।
লিও গুরুদিয়ান

এটি আমার জন্য সমস্যা ছিল তবে এটি খুব কম স্পষ্ট ছিল কারণ আমরা আমাদের ডেটা অ্যাক্সেস লেয়ারের মাধ্যমে একটি বড় লেনদেনে বেশ কয়েকটি স্প্রোক কলগুলি গুটিয়ে রেখেছিলাম - সুতরাং কেবল স্প্রোকের দিকে তাকিয়ে আপনি বলতে পারবেন না যে এখানে কোনও লেনদেন ছিল না। আপনার যদি এই সমস্যা থাকে তবে নিশ্চিত করুন যে স্প্রোকের বাইরে এমন কোনও কিছু নেই যা লেনদেন তৈরি করছে। যদি তা থাকে তবে আপনি স্প্রোকের মধ্যে রিটার্নের স্টেটমেন্টগুলি একেবারেই ব্যবহার করতে পারবেন না।
EF0

এটি আমিই ছিলাম, আমার একটি লেনদেন হয়েছিল এবং যদি আমার / অন্য বিবৃতিতে প্রতিশ্রুতিবদ্ধ লেনদেনের আগে ফিরছিলাম
কেভিন

19

লেনদেন শুরু হওয়ার পরে এটি সাধারণত ঘটে থাকে এবং হয় তা প্রতিশ্রুতিবদ্ধ হয় না বা এটি রোলব্যাক হয় না।

যদি আপনার সঞ্চিত পদ্ধতিতে ত্রুটিটি আসে তবে এটি ডাটাবেস টেবিলগুলিকে লক করতে পারে কারণ ব্যতিক্রম হ্যান্ডলিংয়ের অভাবে কিছু রানটাইম ত্রুটির কারণে লেনদেন সম্পন্ন হয়নি আপনি নীচের মত ব্যতিক্রম হ্যান্ডলিং ব্যবহার করতে পারেন। SET XACT_ABORT

SET XACT_ABORT ON
SET NoCount ON
Begin Try 
     BEGIN TRANSACTION 
        //Insert ,update queries    
     COMMIT
End Try 
Begin Catch 
     ROLLBACK
End Catch

সূত্র


যদি এটি হয় তবে উদ্ধৃত প্রশ্ন / উত্তরটির অর্থ সম্ভবত
এটির

10

এ সম্পর্কে সচেতন হন আপনি যদি নেস্টেড লেনদেনগুলি ব্যবহার করেন তবে একটি রোলব্যাক অপারেশন বাইরের সর্বাধিক একগুলি সহ সমস্ত নেস্টেড লেনদেনকে ফিরিয়ে আনবে।

এটি TRY / CATCH এর সাথে একত্রে ব্যবহারের ফলে আপনার বর্ণিত ত্রুটির ফলস্বরূপ। আরও এখানে দেখুন ।


5

যদি আপনার সঞ্চিত পদ্ধতি কোনও লেনদেন খোলার পরে একটি সংকলন ব্যর্থতার মুখোমুখি হয় (যেমন টেবিলটি পাওয়া যায় নি, অবৈধ কলামের নাম)।

আমি দেখতে পেলাম যে 2 টি স্টোরেজ পদ্ধতিতে একজন "শ্রমিক" এবং একটি র‌্যাপার ব্যবহার করতে হয়েছিল / চেষ্টা করে / উভয়ই রেমাস রুসানু দ্বারা বর্ণিত অনুরূপ যুক্তি দিয়ে ধরতে হয়েছিল। "সাধারণ" ব্যর্থতা এবং র‍্যাপার ক্যাচ সংকলন ব্যর্থতার ত্রুটিগুলি পরিচালনা করতে শ্রমিক ক্যাচ ব্যবহার করা হয়।

https://msdn.microsoft.com/en-us/library/ms175976.aspx

ট্রাই ... ক্যাচ কনস্ট্রাক্ট দ্বারা প্রভাবিত ত্রুটি

নিম্নলিখিত ধরণের ত্রুটিগুলি ক্যাচ ব্লক দ্বারা পরিচালিত হয় না যখন সেগুলি ট্রাই ... ক্যাচ কনস্ট্রাক্টের মতো একই স্তরের কার্যকর হয়!

  • সংশ্লেষ ত্রুটিগুলির মতো সংকলন ত্রুটিগুলি , যা কোনও ব্যাচকে চলমান থেকে বাধা দেয়।
  • বিবৃতি-স্তরের পুনঃসংশোধনের সময় ঘটে যাওয়া ত্রুটিগুলি, যেমন স্থগিত নাম রেজোলিউশনের কারণে সংকলনের পরে ঘটে যাওয়া বস্তুর নাম রেজোলিউশন ত্রুটি।

আশা করি এটি অন্য কাউকে কয়েক ঘন্টা ডিবাগিং সংরক্ষণে সহায়তা করে ...


4
ধন্যবাদ জাস্টিন ভাল পর্যবেক্ষণ। আমার ক্ষেত্রে আমি একটি আপডেটের অভ্যন্তরে একটি সামগ্রিক কাজ করছিলাম যা এসপি সংরক্ষণের সময় সংকলন ত্রুটিগুলি উপস্থাপন করে না তবে প্রকৃতপক্ষে অবৈধ বাক্য গঠন ছিল - "কোনও সমষ্টি কোনও
আপডেটের

4

আমার ক্ষেত্রে, ত্রুটিটি একটি RETURNভিতরে থাকা কারণে ঘটছিল BEGIN TRANSACTION। সুতরাং আমি এই জাতীয় কিছু ছিল:

Begin Transaction
 If (@something = 'foo')
 Begin
     --- do some stuff
     Return
 End
commit

এবং এটি হওয়া দরকার:

Begin Transaction
 If (@something = 'foo')
 Begin
     --- do some stuff
     Rollback Transaction ----- THIS WAS MISSING
     Return
 End
commit

2

আমার জন্য ব্যাপক ডিবাগিংয়ের পরে ফিক্সটি ছিল একটি সাধারণ অনুপস্থিত থ্রো; রোলব্যাক পরে ধরা পড়ার বিবৃতি। এটি বাদ দিয়ে এই কুৎসিত ত্রুটি বার্তাটিই আপনার শেষ হয়।

begin catch
    if @@trancount > 0 rollback transaction;
    throw; --allows capture of useful info when an exception happens within the transaction
end catch

2

আমারও একই ত্রুটি বার্তা ছিল, আমার ভুলটি ছিল যে আমি কমিট ট্রান্সেকশন লাইনের শেষে আমার একটি সেমিকোলন ছিলাম


এই হিসাবে সহজ। এছাড়াও, আমার ক্ষেত্রে 'রোলব্যাক' বিবৃতি দরকার যেখানে এসপি পুরোপুরি কার্যকর হবে না। কেবল লেনদেন বন্ধ / শেষ করার জন্য।
জে কর্ডোর

1

আমার লেনদেন থেকে এই বিবৃতি বাদ দেওয়ার পরে আমি এই ত্রুটির মুখোমুখি হয়েছি।

COMMIT TRANSACTION [MyTransactionName]

1

আমার মতে গৃহীত উত্তর বেশিরভাগ ক্ষেত্রেই ওভারকিল।

ত্রুটির কারণটি প্রায়শই বিগইন এবং কমিমিটের সাথে মেলে না যা পরিষ্কারভাবে ত্রুটির দ্বারা বলা হয়েছে। এর অর্থ ব্যবহার:

Begin
  Begin
    -- your query here
  End
commit

পরিবর্তে

Begin Transaction
  Begin
    -- your query here
  End
commit

শুরুর পরে লেনদেন বাদ দেওয়ার ফলে এই ত্রুটি ঘটে!


1

নিশ্চিত করুন যে একই পদ্ধতিতে / ক্যোয়ারীতে আপনার একাধিক লেনদেন নেই, যার মধ্যে এক বা একাধিকটি বাদ পড়েছে।

আমার ক্ষেত্রে, দুর্ঘটনাক্রমে আমার কাছে ক্যোয়ারিতে একটি শুরু ট্রেন বিবৃতি ছিল


1

আপনি নিজের সি # কোড থেকে এসপিকে যেভাবে আবেদন করছেন তার উপরও এটি নির্ভর করতে পারে। এসপি যদি কিছু টেবিল ধরণের মান দেয় তবে এসপি এক্সিকিউটস্টোরকিউরির সাথে অনুরোধ করুন এবং এসপি যদি কোনও মান না ফেরায় তবে এক্সিকিউটস্টোরকম্যান্ডের সাথে এসপিকে অনুরোধ করুন oke


1

ব্যবহার এড়াতে

RETURN

বিবৃতি যখন আপনি ব্যবহার করছেন

BEGIN TRY
    ... 
END TRY

BEGIN CATCH
    ...
END CATCH

এবং

BEGIN, COMMIT & ROLLBACK

এসকিউএল সঞ্চিত পদ্ধতিতে বিবৃতি


0

আপনার যদি এমন কোনও কোডের কাঠামো থাকে তবে:

SELECT 151
RETURN -151

তারপরে ব্যবহার করুন:

SELECT 151
ROLLBACK
RETURN -151
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.