উত্তর:
সর্বদা লেনদেন তৈরি করা কি খারাপ অভ্যাস?
আপনি এখানে কোন প্রসঙ্গে কথা বলছেন তা নির্ভর করে। যদি এটি আপডেট হয় তবে আমি স্পষ্টভাবে ট্রান্সঅ্যাকশনগুলি ব্যবহার করার পরামর্শ দেব। এটি যদি একটি নির্বাচন করে থাকে তবে NO (স্পষ্টতই)।
তবে অপেক্ষা করুন প্রথমে বোঝার জন্য আরও কিছু রয়েছে: স্কুয়েল সার্ভারে থাকা সমস্ত কিছুই লেনদেনের মধ্যে রয়েছে।
যখন সেশন বিকল্পটি IMPLICIT_TRANSACTIONS
থাকে OFF
এবং আপনি স্পষ্টভাবে নির্দিষ্ট করে থাকেন begin tran
এবং commit/rollback
তারপরে এটি সাধারণত স্পষ্ট লেনদেন হিসাবে পরিচিত । অন্যথায় আপনি একটি স্বতঃসিদ্ধ লেনদেন পাবেন।
যখন IMPLICIT_TRANSACTIONS
হয় ON
একটি অন্তর্নিহিত লেনদেনের যখন বিবৃতি ধরনের বই অনলাইন নিবন্ধ (যেমন নথিভুক্ত এক নির্বাহ স্বয়ংক্রিয়ভাবে শুরু হয় SELECT
/ UPDATE
/ CREATE
) এবং করেছেন বা স্পষ্টভাবে ফিরে ঘূর্ণিত করা আবশ্যক। BEGIN TRAN
এই মোডে একটি কার্যকর করার ফলে বৃদ্ধি হবে @@TRANCOUNT
এবং অন্য "নেস্টেড" লেনদেন শুরু হবে)
আপনি কোন মোডে আছেন তা স্যুইচ করতে, আপনি ব্যবহার করবেন
SET IMPLICIT_TRANSACTIONS ON
অথবা
SET IMPLICIT_TRANSACTIONS OFF
select @@OPTIONS & 2
যদি উপরে 2 প্রদান করে, আপনি অন্তর্ভুক্ত লেনদেনের মোডে আছেন। যদি এটি 0 ফেরত দেয় তবে আপনি স্বতঃসংশ্লিষ্ট in
যখন সত্যই প্রয়োজন হয় না তখন কোনও লেনদেন তৈরি করতে কত খরচ হয়?
ডাটাবেসগুলি একটি সামঞ্জস্যপূর্ণ রাষ্ট্র থেকে অন্য সামঞ্জস্যপূর্ণ স্থানে নিয়ে যাওয়ার প্রয়োজন হয়। লেনদেনের বিকল্প নেই বলে লেনদেনের কোনও মূল্য নেই। তথ্যসূত্র: সারি সংস্করণ ভিত্তিক বিচ্ছিন্নতা স্তরগুলি ব্যবহার করে
এমনকি যদি আপনি একটি বিচ্ছিন্ন স্তরের পঠন_বিহীন ব্যবহার করেন। খারাপ অভ্যাস কি? কারণ এটি লক করার ক্ষেত্রে সমস্যা হওয়া উচিত নয়।
READ_UNCOMMITED বিচ্ছিন্নতা স্তর সংজ্ঞা অনুসারে নোংরা পাঠের অনুমতি দেবে অর্থাত্ একটি লেনদেন অন্যান্য লেনদেনের দ্বারা সংঘবদ্ধ পরিবর্তনগুলি দেখতে সক্ষম হবে। এই বিচ্ছিন্নতা স্তরটি যা করে তা হ'ল এটি লকিংয়ের ওভার হেডকে শিথিল করে - ডাটাবেস সম্মতি রক্ষার জন্য লকগুলি অর্জনের পদ্ধতি।
আপনি এটি কোনও সংযোগ / ক্যোয়ারী স্তরে ব্যবহার করতে পারেন, যাতে এটি অন্যান্য প্রশ্নের উপর প্রভাব ফেলে না।
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
জেফ অ্যাটউডের একটি আকর্ষণীয় নিবন্ধ পেয়েছেন ডাইনিংসকে ডাইনিংসকে ডাইনিং ফিলোসফার্স ধাঁধা কারণে এবং পড়ার জন্য প্রতিশ্রুতিবদ্ধ স্ন্যাপশট বিচ্ছিন্নতা স্তরের বর্ণনা দিয়েছিলেন ।
কৌতূহলের বাইরে, আমি লগ বাইটস ফ্লাশড / সেক, লগ ফ্লাশ ওয়েটস / সেক (এলওজি ফ্লাশের জন্য অপেক্ষা করতে থাকা সেকেন্ডে কমিটের সংখ্যা) যেমন নিচের গ্রাফের মতো পারফোন কাউন্টারগুলির সাথে টি-লগের প্রভাব পরিমাপের জন্য কিছু পরীক্ষা করেছি:
কোডের উদাহরণ :
create table testTran (id int, Name varchar(8))
go
-- 19 sec
-- Autocommit transaction
declare @i int
set @i = 0
while @i < 100000
begin
insert into testTran values (1,'Kin Shah')
set @i = @i+1
end
---------------------------------------------------
-- 2 sec
-- Implicit transaction
SET IMPLICIT_TRANSACTIONS ON
declare @i int
set @i = 0
while @i < 100000
begin
insert into testTran values (1,'Kin Shah')
set @i = @i+1
end
COMMIT;
SET IMPLICIT_TRANSACTIONS OFF
----------------------------------------------------
-- 2 sec
-- Explicit transaction
declare @i int
set @i = 0
BEGIN TRAN
WHILE @i < 100000
Begin
INSERT INTO testTran values (1,'Kin Shah')
set @i = @i+1
End
COMMIT TRAN
স্বতঃসিদ্ধ লেনদেন : (@ ট্র্যাভিসগ্যান দ্বারা হাইলাইট হিসাবে সম্পাদিত)
ছদ্মবেশ এবং সুস্পষ্ট লেনদেন:
একটি ডিএমভি sys.dm_tran_datedia_transferences আছে যা ডাটাবেস স্তরে লেনদেনের তথ্য ফিরিয়ে দেবে।
স্পষ্টতই, প্রভাবটি দেখানোর জন্য এটি আরও সরলিক পরীক্ষা of ডিস্ক সাবসিস্টেম, ডাটাবেস অটো বৃদ্ধির সেটিংস, ডাটাবেসের প্রাথমিক আকার, একই সার্ভার \ ডাটাবেসগুলিতে চলমান অন্যান্য প্রক্রিয়াগুলির মতো অন্যান্য বিষয়গুলিরও প্রভাব থাকবে।
উপরোক্ত পরীক্ষাগুলি থেকে, স্পষ্ট এবং সুস্পষ্ট লেনদেনের মধ্যে কোনও পার্থক্য নেই।
উত্তরে আরও যোগ করতে সহায়তার জন্য @ ট্র্যাভিসগানকে ধন্যবাদ।
একটি এসকিউএল স্টেটমেন্ট সর্বদা লেনদেনের মধ্যে চলে। আপনি যদি স্পষ্টভাবে একটি শুরু না করেন, তবে প্রতিটি এসকিউএল বিবৃতি নিজেই একটি লেনদেনে চলবে।
একমাত্র পছন্দ হ'ল আপনি কোনও লেনদেনে একাধিক বিবৃতি বান্ডিল করবেন কিনা। একাধিক বিবৃতি বিস্তৃত লেনদেনগুলি একযোগে আঘাত করে এমন লকগুলি ফেলে। সুতরাং "সর্বদা" লেনদেন তৈরি করা ভাল ধারণা নয়। আপনার সুবিধার বিপরীতে ব্যয়ের ভারসাম্য রক্ষা করা উচিত।
সমস্যাটি হচ্ছে কোনও একক অপারেশনকে অবশ্যই একক ক্রিয়া হিসাবে বিবেচনা করা উচিত। অন্য কথায় সমস্ত অপারেশন অবশ্যই সম্পন্ন এবং সাফল্যের সাথে প্রতিশ্রুতিবদ্ধ বা অপারেশনগুলির কোনওটিই প্রতিশ্রুতিবদ্ধ হতে পারে না। আপনার যদি এমন একটি দৃশ্যের মুখোমুখি হয় যা আপনার প্রাথমিক ডেটা পড়তে এবং তারপরে সেই ডেটার উপর ভিত্তি করে আপডেটগুলি সম্পাদন করা প্রয়োজন তবে প্রাথমিক পঠন সম্ভবত লেনদেনের অংশ হওয়া উচিত। দ্রষ্টব্য: উদ্দেশ্য হিসাবে আমি নির্বাচন / সন্নিবেশ / আপডেট এড়াচ্ছি। লেনদেনের সুযোগটি অ্যাপ্লিকেশন পর্যায়ে থাকতে পারে এবং একাধিক ডাটাবেস (গুলি) এর ক্রিয়াকলাপ জড়িত হতে পারে। বিমানের আসন সংরক্ষণ বা ব্যাংক ব্যালেন্স কোয়েরি / প্রত্যাহারের মতো ক্লাসিক নিদর্শনগুলির কথা ভাবেন। পুরো অ্যাপ্লিকেশনটির নির্ভরযোগ্য, ধারাবাহিক ডেটা পাওয়া যায় তা নিশ্চিত করতে একজনকে অবশ্যই সমস্যার বিস্তৃত দৃষ্টিভঙ্গি গ্রহণ করতে হবে।
BEGIN TRAN SELECT ... COMMIT
শুধু বনামSELECT
সেখানে প্রদর্শিত হবে একটি হতে অত্যন্ত গৌণ কর্মক্ষমতা পার্থক্য।