আপনি যদি কোনও ডাটাবেসে লেনদেন না করেন (তবে এসকিউএল সার্ভার)?


108

ধরুন আমার একটি প্রশ্ন আছে:

begin tran
-- some other sql code

এবং তারপরে আমি প্রতিশ্রুতিবদ্ধ করতে বা পিছনে ফিরে যেতে ভুলে যাই।

অন্য ক্লায়েন্ট যদি কোনও জিজ্ঞাসা চালানোর চেষ্টা করে তবে কী হবে?

উত্তর:


148

আপনি লেনদেন কমিট বা রোলব্যাক করবেন না , এটি এখনও "চলমান" এবং সম্ভাব্যভাবে লক ধরে আছে।

যদি আপনার ক্লায়েন্ট (অ্যাপ্লিকেশন বা ব্যবহারকারী) প্রতিশ্রুতি দেওয়ার আগে ডাটাবেসের সাথে সংযোগটি বন্ধ করে দেয় তবে যে কোনও চলমান লেনদেন আবার ঘুরিয়ে ফেলা হবে এবং সমাপ্ত হবে।


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

12
পার্শ্ব দ্রষ্টব্য: ম্যানেজমেন্ট স্টুডিও ব্যবহার করা হলে, ক্যোয়ারী উইন্ডোটি বন্ধ করা সংযোগটি বন্ধ করে দেবে
জো ফিলিপস

3
@ ব্র্যাডলিডটনেট: হ্যাঁ, অবশ্যই
মার্চ_এস

2
মনে রাখবেন যে এসকিউএল সার্ভার ম্যানেজমেন্ট স্টুডিও অটো কমিট করে যদি আপনি ডিফল্টভাবে ক্যোয়ারী উইন্ডো / সংযোগটি বন্ধ করেন close
নুনো

1
মনে রাখবেন যে যখন কোনও লেনদেন সক্রিয় থাকাকালীন ক্লায়েন্ট সংযোগটি বন্ধ করে দেয় তখন তা সবসময় পিছনে ফিরে আসে না - এটি ক্লায়েন্ট এবং ডিবি'র উপর নির্ভর করে। উদাহরণস্বরূপ, যখন কোনও জাভা অ্যাপ্লিকেশন কোনও ওরাকল ডিবিতে সংযোগ বন্ধ করে, কোনও খোলা সংযোগ স্বয়ংক্রিয়ভাবে প্রতিশ্রুতিবদ্ধ হয়।
এভিডি

38

আপনি আসলে এটি নিজে চেষ্টা করে দেখতে পারেন, এটি কীভাবে কাজ করে তা অনুভব করতে সহায়তা করা উচিত।

ম্যানেজমেন্ট স্টুডিওতে একটি দুটি উইন্ডো (ট্যাব) খুলুন, তাদের প্রত্যেকেরই স্কয়ারের নিজস্ব সংযোগ থাকবে।

এখন আপনি একটি উইন্ডোতে লেনদেন শুরু করতে পারেন, সারণি / আপডেট / মুছার মতো কিছু জিনিস করুন তবে এখনও প্রতিশ্রুতিবদ্ধ নয়। তারপরে অন্য উইন্ডোতে আপনি দেখতে পাবেন যে লেনদেনের বাইরে থেকে ডাটাবেসটি কেমন দেখাচ্ছে। বিচ্ছিন্নতা স্তরের উপর নির্ভর করে প্রথম উইন্ডোটি প্রতিশ্রুতি না দেওয়া পর্যন্ত টেবিলটি লক হয়ে থাকতে পারে, বা অন্য লেনদেন এখনও পর্যন্ত কী করেছে তা আপনি দেখতে পাবেন না (ইত্যাদি) etc.

বিভিন্ন বিচ্ছিন্নতা স্তর এবং তারা কীভাবে ফলাফলকে প্রভাবিত করে তা দেখার জন্য কোনও লক ইঙ্গিত সহ খেলুন।

লেনদেনে কোনও ত্রুটি ফেললে কী হয় তা দেখুন।

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

আনন্দ কর! GJ।


ঠিক আছে তবে কমিটমেন্ট জারি করার আগে খুব কমপক্ষে লেনদেনটি লগ করার জন্য লেখা হবে? উদাহরণস্বরূপ, বলুন আমি প্রতিশ্রুতি সম্পাদন করার আগে একটি সন্নিবেশ কমান্ড চালিয়ে একটি লেনদেন শুরু করতে চাই এবং "অন্য কিছু করি"। আমার সন্নিবেশ কমান্ড লগ করতে হবে? যদি সার্ভারটি প্রতিশ্রুতি কার্যকর করার আগে ক্র্যাশ হয়ে থাকে তবে এটি যেখানে ছিল সেখানে ফিরে আসতে পারে এবং আমি কেবল পরে প্রতিশ্রুতি দিতে পারি (যখনই আমি "অন্য কিছু" করা হয়ে থাকি)।
ব্যবহারকারী 1870400

16

লেনদেনগুলি সম্পূর্ণরূপে চালানো বা মোটেও নয় intended লেনদেন সম্পন্ন করার একমাত্র উপায় প্রতিশ্রুতিবদ্ধ হওয়া, অন্য কোনও উপায়ের ফলে রোলব্যাক হবে।

অতএব, যদি আপনি শুরু করেন এবং প্রতিশ্রুতিবদ্ধ না হন তবে এটি সংযোগ বন্ধে আবার চালু হবে (কারণ লেনদেনটি সম্পূর্ণরূপে চিহ্নিত না করেই ভেঙে গেছে)।


এটি এমন হওয়া উচিত তবে এটি সবসময় হয় না।
ফ্যালকোগার

... যেমন মাইএসকিউএল এর মাইআইএসএএম, যা লেনদেন সমর্থন করে না , নিশ্চিত।
পিসকভর

3

অসম্পূর্ণ লেনদেনের বিচ্ছিন্নতা স্তরের উপর নির্ভর করে।

এসকিএল লেনদেনের বিচ্ছিন্নতা ব্যাখ্যা করা হয়েছে


6
লেনদেনের আচরণ বিচ্ছিন্নতা স্তরের উপর নির্ভর করে না। তারা যে পরিমাণ লক তৈরি করতে পারে তা করে।
marc_s

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

2

আপনি যখন কোনও লেনদেন খুলেন তখন কিছুই নিজের দ্বারা লক হয়ে যায় না। তবে যদি আপনি সেই লেনদেনের অভ্যন্তরে কিছু জিজ্ঞাসা নির্বাহ করেন, বিচ্ছিন্নতা স্তরের উপর নির্ভর করে কিছু সারি, টেবিল বা পৃষ্ঠাগুলি লক হয়ে যায় যাতে এটি অন্যান্য লেনদেন থেকে তাদের অ্যাক্সেস করার চেষ্টা করে এমন অন্যান্য প্রশ্নের উপর প্রভাব ফেলবে।


1

লেনদেনের জন্য উদাহরণ

শুরু tran tt

আপনার sql বিবৃতি

ত্রুটি দেখা দিলে রোলব্যাক ট্রান টিটি টি কমিট করুন ট্র্যান টিটি

যতক্ষণ আপনি কমিট ট্র্যান টিটি কার্যকর করেনি, ততক্ষণ ডেটা পরিবর্তন হবে না


1
মনে রাখবেন যে নামমাত্র লেনদেনগুলি এমএস এসকিউএল-তে কেবল অপ্রয়োজনীয় নয়, এটি নিয়ন্ত্রণের একটি মিথ্যা ধারণা দিতে পারে। BEGIN TRAN X ... BEGIN TRAN Y ... ROLLBACK Yউদাহরণস্বরূপ, কাজ করে না। দেখুন stackoverflow.com/questions/1273376/...

0

সম্ভাব্য লকিংয়ের সমস্যাগুলির পাশাপাশি আপনি এটি তৈরি করতে পারেন যে আপনার সক্রিয় লেনদেনের জন্য ন্যূনতম এলএসএন পেরিয়ে কাটতে না পারায় আপনার লেনদেনের লগগুলি বাড়তে শুরু করবে এবং যদি আপনি স্ন্যাপশট বিচ্ছিন্নতা ব্যবহার করছেন টেম্পডবিতে আপনার সংস্করণ স্টোর বৃদ্ধি পাবে একই কারণ।

আপনি dbcc opentranসবচেয়ে পুরানো উন্মুক্ত লেনদেনের বিশদটি দেখতে ব্যবহার করতে পারেন।


0

যে কোনও শর্তহীন লেনদেন সার্ভারকে লক করে রাখবে এবং অন্যান্য অনুসন্ধানগুলি সার্ভারে কার্যকর হবে না। আপনার হয় লেনদেন রোলব্যাক করতে হবে বা এটি কমিট করতে হবে। এসএসএমএস বন্ধ করে দেওয়ার ফলে লেনদেনের অবসান হবে যা অন্যান্য প্রশ্নগুলি কার্যকর করতে দেবে।


-4

আচরণটি সংজ্ঞায়িত করা হয় নি, সুতরাং আপনাকে অবশ্যই কমিট বা রোলব্যাক সেট করতে হবে:

http://docs.oracle.com/cd/B10500_01/java.920/a96654/basic.htm#1003303

"যদি অটো-কমিট মোড অক্ষম হয়ে যায় এবং আপনি আপনার শেষ পরিবর্তনগুলি স্পষ্টভাবে প্রতিশ্রুতিবদ্ধ না করে বা ফিরিয়ে না দিয়ে সংযোগটি বন্ধ করে দেন তবে একটি অন্তর্নিহিত COMMIT অপারেশন কার্যকর করা হবে।"

Hsqldb একটি রোলব্যাক করে

con.setAutoCommit(false);
stmt.executeUpdate("insert into USER values ('" +  insertedUserId + "','Anton','Alaf')");
con.close();

ফলাফল হয়

2011-11-14 14: 20: 22,519 প্রধান তথ্য INFO [SqlAutoCommitE উদাহরণ: 55] [স্বতঃসংশ্লিষ্ট সক্ষম = মিথ্যা] 2011-11-14 14: 20: 22,546 প্রধান তথ্য INFO [SqlAutoCommitExample: 65] [ডাটাবেসে 0 জন ব্যবহারকারী পাওয়া গেছে]


2
এটি ওরাকল-এর ক্ষেত্রে সত্য হতে পারে (আমার কোনও ধারণা নেই) তবে প্রশ্নকর্তা এমএস-এসকিউএল সম্পর্কে জিজ্ঞাসা করছেন
PaulG

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