আমি কি কোনও ব্যবহারকারী সংজ্ঞায়িত টেবিল প্রকার তৈরি করতে এবং এটি একই লেনদেনে ব্যবহার করতে পারি?


13

আমি যখন নিম্নলিখিতগুলি সম্পাদন করি (পরিচালনা স্টুডিওতে, জিও আদেশগুলি ব্যাচগুলিতে আলাদা করে দেবে)

use tempdb

begin tran
go

CREATE TYPE dbo.IntIntSet AS TABLE(
    Value0 Int NOT NULL,
    Value1 Int NOT NULL
)
go

declare @myPK dbo.IntIntSet;
go

rollback

আমি একটি অচলাবস্থার ত্রুটি বার্তা পেয়েছি। আমার প্রক্রিয়া নিজেই অচল হয়ে গেছে। আমি এই আচরণটি 2008, 2008R2 এবং 2012 এ দেখেছি।

আমার সদ্য নির্মিত টাইপটি যে একই লেনদেন তৈরি হয়েছিল তাতে কি ব্যবহার করার কোনও উপায় আছে?


কেন আপনি লেনদেনের ভিতরে এটি করছেন? আপনি কি 'অস্থায়ী' ইউডিটির আশা করছেন?
ম্যাক্স ভার্নন

2
আমি জানতাম আমি এই প্রশ্নটি পাব। এটি একটি সংহত পরীক্ষার অংশ। ইন্টিগ্রেশন টেস্ট ফ্রেমওয়ার্ক একক লেনদেনে সবকিছু সম্পাদন করে।
মাইকেল জে স্বার্ট

1
পরীক্ষাটি কার্যকর করার আগে পরীক্ষার জন্য প্রয়োজনীয় প্রকারগুলি তৈরি করা একটি সুস্পষ্ট কর্মসূচী। স্পষ্টতই, এটি আপনাকে পরীক্ষাটি স্বয়ংক্রিয় করতে সহায়তা করে না।
ম্যাক্স ভার্নন

@ মিশেল জেসওয়ার্ট, আপনি কী আরও কিছু অর্জন করতে চাইছেন? টেবিলের ধরণগুলি এতটা সীমাবদ্ধ, আপনি এটি নিয়ে যাচ্ছেন তা আমি বেশ দেখতে পাচ্ছি না।
সেবাস্তিয়ান মেইন

উত্তর:


15

এটি চারবারের চেয়ে কম রিপোর্ট করা হয়েছে। এটি স্থির হিসাবে বন্ধ ছিল:

http://connect.microsoft.com/SQLServer/feedback/details/365876/

তবে এটি সত্য ছিল না। (এছাড়াও কাজের ক্ষেত্রের বিভাগটি দেখুন - আমি যে প্রস্তাবিত কর্মকাণ্ডটি সর্বদা গ্রহণযোগ্য হবে না))

এইটি নকশা দ্বারা বন্ধ করা হয়েছিল / ঠিক হয়ে যায় না:

http://connect.microsoft.com/SQLServer/feedback/details/581193/

এই দুটি নতুন এবং এখনও সক্রিয় :

http://connect.microsoft.com/SQLServer/feedback/details/800919/ (এখন ঠিক হবে না এটি স্থির হবে )

http://connect.microsoft.com/SQLServer/feedback/details/804365/ (এখন ডিজাইন অনুসারে বন্ধ )

যতক্ষণ না মাইক্রোসফ্ট অন্যথায় বিশ্বাসী হতে পারে, ততক্ষণে আপনাকে একটি কার্যনির্বাহী সন্ধান করতে হবে - কেবলমাত্র আপনার পরীক্ষা চালানোর আগে সমস্ত ধরণের মোতায়েন করা উচিত, বা একাধিক পরীক্ষায় বিভক্ত করা।

প্রথম দিকের আইটেমটি স্থির করে উমচাঁদারের অর্থ কী তা সম্পর্কে আমি আমার পরিচিতিগুলির কাছ থেকে নিশ্চয়তা নেওয়ার চেষ্টা করব, কারণ স্পষ্টতই পরবর্তী বিবৃতিগুলির সাথে এটি দ্বন্দ্ব।

আপডেট 1 # (আশা, ঠিক 2)

মূল বাগ (যা স্থির হিসাবে বন্ধ ছিল) জড়িত ওরফে প্রকারগুলি জড়িত, তবে প্রকারের নয় TABLE। এটি এসকিউএল সার্ভার 2005 এর বিরুদ্ধে প্রতিবেদন করা হয়েছিল, এতে স্পষ্টতই টেবিলের ধরণ এবং টিভিপি নেই। ইউসি জানিয়েছে যে নন-টেবিল ওরফে ধরণের বাগটি তারা কীভাবে অভ্যন্তরীণ লেনদেন পরিচালনা করে তার উপর ভিত্তি করে স্থির করা হয়েছিল, তবে এটি পরে টেবিলের প্রকারের সাথে প্রবর্তিত অনুরূপ দৃশ্যের আচ্ছাদন দেয়নি। সেই আসল বাগটি কখনও স্থির হিসাবে বন্ধ করা উচিত ছিল কিনা তা নিশ্চিত হওয়ার অপেক্ষায় রয়েছি; আমি প্রস্তাব দিয়েছি যে চারটি ডিজাইনের দ্বারা বন্ধ করা উচিত। এটি আংশিক কারণ এটি যেভাবে আমি এটির কাজটি কীভাবে প্রত্যাশা করছিলাম সেই ধরনের এবং আংশিক কারণ আমি ইউসির কাছ থেকে উপলব্ধি পেয়েছি যে এটি "ফিক্সিং" করে অন্যভাবে কাজ করা অত্যন্ত জটিল, পশ্চাদপদ সামঞ্জস্যতা ভেঙে দিতে পারে এবং একটি ক্ষেত্রে সহায়ক হতে পারে ব্যবহারের ক্ষেত্রে খুব সীমিত সংখ্যক। আপনার বা আপনার ব্যবহারের মামলার বিরুদ্ধে কিছুই নয়, তবে পরীক্ষার দৃশ্যের বাইরে আমি '

আপডেট # 2

আমি এই সমস্যাটি সম্পর্কে ব্লগ করেছি:

http://www.sqlperformance.com/2013/11/t-sql-queries/single-tx-deadlock


1

আমি এটি পুনরুত্পাদন করতে সক্ষম হয়েছি। অচলাবস্থা গ্রাফটি বেশ কৌতূহলযুক্ত:

<deadlock-list>
  <deadlock victim="process47f948">
    <process-list>
      <process id="process47f948" taskpriority="0" logused="0" waitresource="METADATA: database_id = 2 USER_TYPE(user_type_id = 257)" waittime="3607" ownerId="14873" transactionname="@myPK" lasttranstarted="2013-11-06T13:23:12.177" XDES="0x80f6d950" lockMode="Sch-S" schedulerid="1" kpid="2672" status="suspended" spid="54" sbid="0" ecid="0" priority="0" trancount="1" lastbatchstarted="2013-11-06T13:23:12.167" lastbatchcompleted="2013-11-06T13:23:12.163" clientapp="Microsoft SQL Server Management Studio - Query" hostname="xxxxx" hostpid="5276" loginname="xxxxx\xxxxx" isolationlevel="read committed (2)" xactid="14867" currentdb="2" lockTimeout="4294967295" clientoption1="671090784" clientoption2="390200">
        <executionStack>
          <frame procname="adhoc" line="2" sqlhandle="0x010002002d9fe3155066b380000000000000000000000000">
declare @myPK dbo.IntIntSet;     </frame>
        </executionStack>
        <inputbuf>

declare @myPK dbo.IntIntSet;
    </inputbuf>
      </process>
    </process-list>
    <resource-list>
      <metadatalock subresource="USER_TYPE" classid="user_type_id = 257" dbid="2" id="lock8009cc00" mode="Sch-M">
        <owner-list>
          <owner id="process47f948" mode="Sch-M" />
        </owner-list>
        <waiter-list>
          <waiter id="process47f948" mode="Sch-S" requestType="wait" />
        </waiter-list>
      </metadatalock>
    </resource-list>
  </deadlock>
</deadlock-list>

এটি আমার কাছে ত্রুটির মতো দেখায় এবং আমি আপনাকে এটির জন্য একটি সংযোগ আইটেম খোলার পরামর্শ দিচ্ছি।


আপনার তাত্ক্ষণিক সমস্যাটি পেতে আপনি ব্যবহার করতে পারেন tSQLt.NewConnection(আমি ধরে নিচ্ছি আপনি টিএসকিউএলটি ব্যবহার করছেন)

use tempdb

begin tran
go
EXEC tSQLt.NewConnection '
CREATE TYPE dbo.IntIntSet AS TABLE(
    Value0 Int NOT NULL,
    Value1 Int NOT NULL
)
';
go

declare @myPK dbo.IntIntSet;
go

rollback

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


2
আপনার সাহায্যের জন্য ধন্যবাদ সেবাস্তিয়ান। দুর্ভাগ্যক্রমে, আমি টিএসকিউএলটি ব্যবহার করছি না। আপনি বুঝতে পারবেন না যে উড়ে একটি প্রকার তৈরি করার প্রয়োজনীয়তা কোথা থেকে এসেছে কারণ আমি এটি ব্যাখ্যা করি নি। আমি জিনিসগুলিকে অত্যধিক জটিল করে তুলছি না, তবে এটি প্রদর্শন করার প্রয়োজন মনে করি না।
মাইকেল জে স্বার্ট

ভাল, টিএসকিউএলটি.নিউজকনেকশনটি কীভাবে প্রয়োগ করা হয় তার টিএসকিউএলটি উত্স কোডটি দেখুন। এটি মোটামুটি সোজা এগিয়ে এবং আপনার কাঠামোর মধ্যেও কাজ করা উচিত।
সেবাস্তিয়ান মেইন

1
প্রকারটি তৈরি করতে এবং তারপরে এটিকে একই লেনদেনের ফলে ডেডলকের ফলাফল হিসাবে ব্যবহার করার যে কোনও প্রয়াস রয়েছে (আমার বাগ রিপোর্টটি দেখুন, হারুনের পোস্টে যুক্ত - শেষ লিঙ্কে); এই কাজটি কার্যকর হবে না (ভাল, ধরে নিবেন যে এটি বোবা কিছু করে না যেমন ইনপুট বিবৃতি কার্যকর করার আগে একটি উন্মুক্ত লেনদেনের প্রতিশ্রুতিবদ্ধ)।
জন সেগেল

-1

যদি কেউ আলাদা না জেনে থাকে তবে আমি মনে করি না যে এটি একটি একক লেনদেনের মধ্যে করার উপায় আছে। আমি মনে করি না এটি একটি বাগ।

প্রথমে আপনি টাইপটি তৈরি করার সময় আপনার একটি স্কিমা পরিবর্তন লক (Sch-M) নেওয়া দরকার। যেহেতু আপনি লেনদেন করেন না, লকটি খোলা থাকে। তারপরে আপনি একই লেনদেনে সেই ধরণের একটি ভেরিয়েবল ঘোষণা করার চেষ্টা করবেন। এটি স্কিমা স্থিতিশীলতা লক (Sch-S) নেওয়ার চেষ্টা করে। এই দুটি ধরণের একই জিনিস একই সাথে বেমানান। যেহেতু তারা একই লেনদেনের মধ্যে রয়েছে, এসকিউএল এটিকে একটি অচলাবস্থা হিসাবে বিবেচনা করে কারণ লেনদেন খোলা থাকাকালীন কখনই স্ক-এস মঞ্জুর করা যায় না।

একবারে প্রতিটি ব্যাচ চালান, এবং ভেরিয়েবল ঘোষণার চেষ্টা করার সাথে সাথে sys.dm_tran_locks এর বিরুদ্ধে নির্বাচন করুন। আপনি একই প্রক্রিয়াটি কোনও Sch-M ধরে আছেন এবং একই বস্তুতে কোনও Sch-S এর জন্য অপেক্ষা করতে দেখবেন।


3
প্রকারগুলি বেমানান, তবে আমি ভেবেছিলাম যে একই প্রক্রিয়াটি নিজেই অপেক্ষা করতে হবে না। উদাহরণস্বরূপ, আমি কোনও টেবিলে একটি কলাম যুক্ত করতে পারি এবং তারপরে এটি একই লেনদেনে ব্যবহার করতে পারি।
মাইকেল জে স্বার্ট

3
লক ম্যানেজারটি বুঝতে হবে যে প্রক্রিয়াটি ইতিমধ্যে সংস্থানটিতে একটি (প্রকৃতপক্ষে শক্তিশালী) লক ধরে আছে এবং প্রক্রিয়াটির জন্য অপেক্ষা করতে হবে না। আপনি প্রথমে প্রথমে একটি সারি আপডেট করতে পারেন এবং তারপরে আবারও পড়তে পারেন - একই পরিস্থিতিতে।
সেবাস্তিয়ান মেইন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.