কীভাবে কোনও ফাইল লেনদেনের কপি করবেন?


9

আমি এ থেকে বি তে একটি ফাইল অনুলিপি করতে চাই, যা বিভিন্ন ফাইল সিস্টেমে থাকতে পারে।

কিছু অতিরিক্ত প্রয়োজনীয়তা রয়েছে:

  1. অনুলিপিটি সমস্ত বা কিছুই নয়, ক্র্যাশের সময় কোনও আংশিক বা দূষিত ফাইল বি নেই;
  2. একটি বিদ্যমান ফাইল বি ওভাররাইট করবেন না;
  3. একই কমান্ডের একযোগে সম্পাদনের সাথে প্রতিযোগিতা করবেন না, সর্বাধিক একজন সফল হতে পারেন।

আমি মনে করি এটি কাছে এসেছে:

cp A B.part && \
ln B B.part && \
rm B.part

কিন্তু ৩. বিপিআরটি উপস্থিত থাকলে সিপি ব্যর্থ না হয়ে লঙ্ঘন করেছে (এমনকি-পতাকা রয়েছে)। পরবর্তীকালে 1. ব্যর্থ হতে পারে যদি অন্য প্রক্রিয়াটি 'জয়ী' হয় এবং সিপি এবং জায়গায় লিঙ্কযুক্ত ফাইলটি অসম্পূর্ণ থাকে। বি. পার্ট একটি সম্পর্কযুক্ত ফাইলও হতে পারে তবে আমি অন্য ক্ষেত্রে লুকানো নামের চেষ্টা না করে ব্যর্থ হতে পেরে খুশি।

আমি মনে করি বাশ নোক্লোবার সাহায্য করে, এটি কি পুরোপুরি কাজ করে? বাশ সংস্করণের প্রয়োজনীয়তা ছাড়াই কি কোনও উপায় আছে?

#!/usr/bin/env bash
set -o noclobber
cat A > B.part && \
ln B.part B && \
rm B.part

ফলোআপ, আমি জানি কিছু ফাইল সিস্টেম যাইহোক (এনএফএস) এ ব্যর্থ হবে। এই ধরনের ফাইল সিস্টেম সনাক্ত করার কোনও উপায় আছে কি?

কিছু অন্যান্য সম্পর্কিত কিন্তু একই প্রশ্নগুলি না:

আনুমানিক ফাইল সিস্টেম জুড়ে পারমাণবিক পদক্ষেপ?

আমার এফএসে এমভি পারমাণবিক?

ইএমএমসি-তে টেম্ফএফস থেকে ext4 বিভাজনে ফাইল এবং ডিরেক্টরিটিকে পরমাণুভাবে স্থানান্তর করার কোনও উপায় আছে

https://rcrowley.org/2010/01/06/things-unix-can-do-atomically.html


2
আপনি কি কেবল একই কমান্ডের সমকালীন সম্পাদন (যেমন আপনার সরঞ্জামের মধ্যে লক করতে পারে), বা ফাইলগুলির সাথে বাইরের কোনও হস্তক্ষেপ সম্পর্কে উদ্বিগ্ন?
মাইকেল হোমার

3
বার্নস "সম্পাদনামূলক" ভালো হতে পারে
muru

1
হাতিয়ারটির মধ্যে মাইচেলহোমর যথেষ্ট পরিমাণে ভাল, আমি মনে করি বাইরের জিনিসগুলি খুব শক্ত করে তুলবে! যদিও ফাইল লক দিয়ে এটি সম্ভব যদি ...
ইভান বেন

1
@মার্সেলম mvএকটি বিদ্যমান ফাইল বিকে ওভাররাইট mv -nকরবে যে এটি ব্যর্থ হয়েছে তা অবহিত করবে না। ln(1)( rename(2)) বি ইতিমধ্যে উপস্থিত থাকলে ব্যর্থ হবে।
ইভান বেন

1
@ ইভেনবেইন গুড পয়েন্ট! আপনার প্রয়োজনগুলি আরও ভাল করে পড়া উচিত ছিল। (আমার বিদ্যমান টার্গেটের পারমাণবিক আপডেটের প্রয়োজন আছে, এবং আমি তা মনে
রেখেই

উত্তর:


11

rsyncএই কাজ করে। অস্থায়ী ফাইলটি O_EXCLডিফল্টরূপে তৈরি করা হয় (কেবলমাত্র আপনি যদি ব্যবহার করেন তবে অক্ষম করুন --inplace) এবং তারপরে renamedটার্গেট ফাইলের মাধ্যমে। --ignore-existingবি বিদ্যমান থাকলে ওভাররাইট না করার জন্য ব্যবহার করুন ।

অনুশীলনে, আমি এক্সট 4, জেডএফএস বা এমনকি এনএফএস মাউন্টগুলিতে এর সাথে কোনও সমস্যায় পড়িনি।


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

Rsync # 3 প্রয়োজনে সাহায্য করে না, যতদূর আমি বলতে পারি। তবুও, এটি একটি দুর্দান্ত সরঞ্জাম এবং আপনার কিছুটা ম্যান-পৃষ্ঠার পঠন থেকে বিরত থাকা উচিত নয়। আপনি github.com/tldr-pages/tldr/blob/master/pages/common/rsync.md বা cheat.sh/rsync হয়ও চেষ্টা করতে পারেন । (টিএলডিআর এবং প্রতারণা দুটি পৃথক প্রকল্প যা আপনার বর্ণিত সমস্যার সাথে উদ্বুদ্ধ করার উদ্দেশ্যে লক্ষ্য করে, যেমন, "ম্যান পেজ টিএল; ডিআর"; প্রচুর প্রচলিত কমান্ড সমর্থিত, এবং আপনি সর্বাধিক সাধারণ ব্যবহারগুলি দেখবেন
সিটরাম

@ ইভেনবেন আরএসএনসি একটি দুর্দান্ত সরঞ্জাম এবং শেখার পক্ষে মূল্যবান! এটি ম্যান পৃষ্ঠা জটিল কারণ এটি বহুমুখী। আতঙ্কিত হবেন না :)
জোশ

@ সিটরাম, # 3 পিড ফাইলের মাধ্যমে সমাধান করা যেতে পারে। উত্তরের মতো একটি ছোট স্ক্রিপ্ট ।
রবার্ট রিডল

2
এটি সেরা উত্তর। রাইকিঙ্ক হ'ল পারমাণবিক ফাইল স্থানান্তরের জন্য শিল্পের স্ট্যান্ডার্ড যান, এবং বিভিন্ন কনফিগারেশনে আপনার সমস্ত প্রয়োজনীয়তা পূরণ করতে পারে।
wKavey

4

ধন্যবাদ, এই সংক্ষিপ্ত উত্তরটি গ্রহণ করার জন্য প্রলুব্ধ এনএফএসের মতো ছদ্মবেশী ফাইল সিস্টেমে কোনও মন্তব্য?
ইভান বেন

@ ইভেনবেইন, আমি যুক্ত করে বোঝাতে চাইছি যে এনএফএস আপনাকে এখানে কোনও উপায়ে গণ্ডগোল করছে কিনা তা আমি নিশ্চিত নই, তবে আমি ভুলে গেছি।
ইল্কাচ্চু

4

আপনি এনএফএস সম্পর্কে জিজ্ঞাসা করেছেন। এই জাতীয় কোডটি এনএফএসের অধীনে ভেঙে যাওয়ার সম্ভাবনা রয়েছে, যেহেতু চেকের জন্য noclobberদুটি পৃথক এনএফএস অপারেশন জড়িত (ফাইল উপস্থিত রয়েছে কিনা তা পরীক্ষা করুন, নতুন ফাইল তৈরি করুন) এবং দুটি পৃথক এনএফএস ক্লায়েন্টের দুটি প্রক্রিয়া একটি রেস অবস্থায় আসতে পারে যেখানে উভয়ই সফল হয় ( উভয়ই যাচাই করে যা B.partএখনও বিদ্যমান নেই, তবে উভয়ই এটি সফলভাবে তৈরি করতে এগিয়ে যায়, ফলস্বরূপ তারা একে অপরকে ওভাররাইট করে're

আপনি যে ফাইল সিস্টেমটি লিখছেন noclobberসেটিকে পরমাণুগতভাবে বা না করার মতো কোনও কিছু সমর্থন করবে কিনা সে সম্পর্কে সত্যই জেনেরিক চেক করার দরকার নেই। আপনি ফাইল সিস্টেমের ধরণটি যাচাই করতে পারেন, এটি এনএফএস কিনা, তবে এটি গৌণবাদী এবং গ্যারান্টি নয় not এসএমবি / সিআইএফএস (সাম্বা) এর মতো ফাইল সিস্টেমগুলিও একই সমস্যায় ভুগতে পারে। FUSE- র মাধ্যমে ফাইল সিস্টেমগুলি সঠিকভাবে আচরণ করতে পারে বা নাও করতে পারে তবে এটি বেশিরভাগ বাস্তবায়নের উপর নির্ভর করে।


B.partএকটি অনন্য ফাইল নাম (অন্যান্য এজেন্টদের সহযোগিতার মাধ্যমে) ব্যবহার করে পদক্ষেপে সংঘর্ষ এড়ানো সম্ভবত সম্ভাবনাময় আরও ভাল উপায় যা আপনাকে নির্ভর করতে হবে না noclobber। উদাহরণস্বরূপ, আপনি ফাইলের নামের অংশ হিসাবে আপনার হোস্টনাম, পিআইডি এবং একটি টাইমস্ট্যাম্প (+ সম্ভবত একটি এলোমেলো সংখ্যা।) অন্তর্ভুক্ত করতে পারেন যেহেতু কোনও নির্দিষ্ট সময়ে কোনও হোস্টে একটি নির্দিষ্ট পিআইডি অধীনে চলমান একক প্রক্রিয়া থাকা উচিত, এটি হওয়া উচিত স্বতন্ত্রতা গ্যারান্টি।

সুতরাং যে কোনও একটি:

test -f B && continue  # skip already existing
unique=$(hostname).$$.$(date +%s).$RANDOM
cp A B.part."$unique"
# Maybe check for existance of B again, remove
# the temporary file and bail out in that case.
mv B.part."$unique" B
# mv (rename) should always succeed, overwrite a
# previously copied B if one exists.

বা:

test -f B && continue  # skip already existing
unique=$(hostname).$$.$(date +%s).$RANDOM
cp A B.part."$unique"
if ln B.part."$unique" B ; then
    echo "Success creating B"
else
    echo "Failed creating B, already existed"
fi
# Both cases require cleanup.
rm B.part."$unique"

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

আপনি অনুলিপি পরে এবং আগে আবার চেক করে জাতি আকার কমে যায় mvবা lnঅপারেশন, কিন্তু এখনও একটি ছোট জাতি শর্ত আছে। তবে, বর্ণের শর্ত নির্বিশেষে, বি এর বিষয়বস্তুগুলি ধারাবাহিক হওয়া উচিত, ধরে নেওয়া উভয় প্রক্রিয়া এ থেকে তৈরি করার চেষ্টা করছে (বা উত্স হিসাবে কোনও বৈধ ফাইল থেকে একটি অনুলিপি))

মনে রাখবেন যে প্রথম পরিস্থিতিতে mvযখন একটি দৌড় বিদ্যমান তখন শেষ প্রক্রিয়াটি হ'ল কে জিতবে, যেহেতু পুনর্নবীকরণ (2) পরমাণুভাবে একটি বিদ্যমান ফাইলটি প্রতিস্থাপন করবে:

যদি নতুনপথ ইতিমধ্যে বিদ্যমান থাকে তবে এটি পরমাণুভাবে প্রতিস্থাপন করা হবে, যাতে নতুনপথ অ্যাক্সেস করার চেষ্টা করার অন্য কোনও প্রক্রিয়া এটি অনুপস্থিত খুঁজে পাবে এমন কোনও বিন্দু নেই। [...]

যদি নতুনপথ বিদ্যমান থাকে তবে কোনও কারণে অপারেশন ব্যর্থ হয়, rename()তবে নতুনপথের উদাহরণটি জায়গায় রাখার গ্যারান্টি দেয় ।

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

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

অবশেষে, আপনি লকিংয়ের কথা উল্লেখ করেছেন। দুর্ভাগ্যক্রমে লকিংয়ের গুরুতর অভাব রয়েছে, কমপক্ষে এনএফএসভি 3-তে (এনএফএসভি 4 সম্পর্কে নিশ্চিত নয় তবে আমি বাজি ধরছি এটিও ভাল নয়।) আপনি যদি লকিংয়ের কথা বিবেচনা করছেন তবে আপনার সম্ভবত বিতরণকৃত লকিংয়ের জন্য বিভিন্ন প্রোটোকলটি সন্ধান করা উচিত, সম্ভবত ব্যান্ডের বাইরে প্রকৃত ফাইলের অনুলিপিগুলি, তবে এটি উভয়ই বাধাদানকারী, জটিল এবং ডেডলকগুলির মতো সমস্যাগুলির ঝুঁকিতে পড়েছে, তাই আমি এড়াতে পারাই ভাল।


এনএফএসে পারমাণবিকতার বিষয়ে আরও পটভূমির জন্য, আপনি মাইল্ডির মেলবক্স ফর্ম্যাটটিতে পড়তে চাইতে পারেন , যা লকগুলি এড়াতে এবং এমনকি এনএফএসে নির্ভরযোগ্যভাবে কাজ করার জন্য তৈরি করা হয়েছিল। এটি সর্বত্র অনন্য ফাইলের নাম রেখে এটি করে (যাতে আপনি শেষ পর্যন্ত একটি চূড়ান্ত বি পান না))

আপনার নির্দিষ্ট ক্ষেত্রে সম্ভবত কিছুটা আকর্ষণীয়, মাইল্ডির ++ ফর্ম্যাট মেলডিরকে মেলবক্স কোটার সমর্থন যোগ করার জন্য প্রসারিত করে এবং মেলবক্সের অভ্যন্তরে একটি নির্দিষ্ট নাম সহ কোনও ফাইল অ্যাটমিকভাবে আপডেট করে (যাতে এটি আপনার বি এর আরও নিকটবর্তী হতে পারে) আমি মনে করি মাইল্ডির ++ চেষ্টা করে যোগ করার জন্য, যা এনএফএস-এ সত্যিই নিরাপদ নয়, তবে একটি পুনর্বিবেচনা পদ্ধতি রয়েছে যা এর অনুরূপ একটি পদ্ধতি ব্যবহার করে এবং এটি পারমাণবিক প্রতিস্থাপন হিসাবে বৈধ।

আশা করি এই সমস্ত পয়েন্টার কার্যকর হবে!


2

আপনি এই জন্য একটি প্রোগ্রাম লিখতে পারেন।

open(O_CREAT|O_RDWD)টার্গেট ফাইলটি খোলার জন্য ব্যবহার করুন, লক্ষ্য ফাইলটি একটি সম্পূর্ণ কিনা তা পরীক্ষা করতে সমস্ত বাইট এবং মেটাডেটা পড়ুন, যদি না হয় তবে দুটি সম্ভাবনা রয়েছে,

  1. অসম্পূর্ণ লেখা

  2. অন্যান্য প্রক্রিয়া একই প্রোগ্রাম চলছে।

লক্ষ্য ফাইলটিতে একটি ওপেন ফাইলের বিবরণ লকটি অর্জন করার চেষ্টা করুন।

ব্যর্থতা মানে একটি সহকারী প্রক্রিয়া আছে, বর্তমান প্রক্রিয়াটি থাকা উচিত।

সাফল্য মানে শেষ রাইটিং ক্র্যাশ হয়েছে, আপনার ফাইলটি লিখে লিখে শুরু করার চেষ্টা করা উচিত।

এছাড়াও লক্ষ্য করুন যে আপনি fsync()ফাইলটি বন্ধ করার আগে এবং লকটি প্রকাশের আগে টার্গেট ফাইলে লেখার পরে আপনি আরও ভাল হয়ে উঠতে পারেন বা অন্য প্রক্রিয়াটি অন-ডিস্ক-অন-ডেটা পড়তে পারে।

https://www.gnu.org/software/libc/manual/html_node/Open-File-Description-Locks.html

একযোগে চলমান প্রোগ্রাম এবং শেষ পর্যন্ত ক্র্যাশ হওয়া অপারেশনের মধ্যে পার্থক্য করতে আপনাকে সহায়তা করা এটি গুরুত্বপূর্ণ।


তথ্যের জন্য ধন্যবাদ, আমি এটি নিজেই প্রয়োগ করতে আগ্রহী এবং এটিকে আরও একবার দেব a আমি অবাক হয়েছি কিছু কোর্টিলস / অনুরূপ প্যাকেজের অংশ হিসাবে এটি ইতিমধ্যে বিদ্যমান নেই!
ইভান বেন

এই পদ্ধতির ক্র্যাশ প্রয়োজনীয়তার কারণে আংশিক বা দূষিত ফাইল বি পূরণ করতে পারে না । কোনও অস্থায়ী নামে ফাইলটি অনুলিপি করার স্ট্যান্ডার্ড পদ্ধতির ব্যবহার করা সবচেয়ে ভাল, তারপরে এটি স্থানান্তরিত করুন: পদক্ষেপটি পারমাণবিক হতে পারে, যা অনুলিপি করা যায় না।
পুনর্নির্মাণ পোস্ট

@ রিনিয়ারপোস্ট যদি ক্রাশ হয় তবে ডেটা পুরোপুরি অনুলিপি করা হয়নি, আংশিকভাবে অনুলিপি করা ডেটা যাই থাকুক না কেন ছেড়ে দেওয়া হবে। তবে আমার পদ্ধতি এটি সনাক্ত করবে এবং এটি ঠিক করবে। কোনও ফাইল সরিয়ে নেওয়া পারমাণবিক হতে পারে না, ডিস্ক ক্রস ফিজিক্যাল সেক্টরে লিখিত কোনও তথ্য পারমাণবিক হবে না, তবে সফ্টওয়্যার (যেমন, ওএস ফাইল সিস্টেম ড্রাইভার, এই পদ্ধতির) এটি ঠিক করতে পারে (rw হলে) বা একটি সামঞ্জস্যপূর্ণ অবস্থার প্রতিবেদন করতে পারে (যদি রো) , যেমন প্রশ্নের মন্তব্য বিভাগে উল্লিখিত। এছাড়াও প্রশ্নটি অনুলিপি সম্পর্কে, সরানো নয়।
5 薯条 德里克

আমি ও_এমপিএফএলও দেখেছি যা সম্ভবত সাহায্য করবে। (এবং যদি এফএসে পাওয়া না যায় তবে একটি ত্রুটি ঘটায়)
ইভান বেন

@ আপনি কি দস্তাবেজটি পড়েছেন বা কখনও কখনও ভেবে দেখেছেন যে কেন O_TMPFILE ফাইল সিস্টেমের সহায়তায় নির্ভর করবে?
11 薯条 德里克

0

আপনি একটি করে সঠিক ফলাফলের পাবেন cpএকসাথে mv। এটি হয় হয় "B" এর পরিবর্তে "A" এর একটি নতুন কপি দিয়ে প্রতিস্থাপন করবে বা "B" কে আগের মতো ছেড়ে দেবে।

cp A B.tmp && mv B.tmp B

বিদ্যমান থাকার জন্য আপডেট করুন B:

cp A B.tmp && if [ ! -e B ]; then mv B.tmp B; else rm B.tmp; fi

এটি 100% পারমাণবিক নয়, তবে এটি নিকটবর্তী হয়। একটি দৌড় শর্ত রয়েছে যেখানে এই দুটি জিনিস চলছে, উভয়ই ifএকই সাথে পরীক্ষায় প্রবেশ করে , উভয়ই দেখতে পায় যে Bবিদ্যমান নেই, তারপরে উভয়ই কার্যকর করে mv


এমভি বিটিএমপি বি একটি পূর্ব-বিদ্যমান বি। সিপি এ বিটিএমপি একটি পূর্ব-বিদ্যমান বিটিএমপি উভয়ই ব্যর্থতা মুছে ফেলবে।
ইভান বেন

mv B.tmp Bcp A B.tmpপ্রথম রান না করে চালানো হবে না এবং একটি সাফল্যের ফলাফলের কোডটি ফেরত দেয়। কিভাবে এটি একটি ব্যর্থতা? এছাড়াও, আমি সম্মত হই যে cp A B.tmpকোনও বিদ্যমানটিকে ওভাররাইট করবে B.tmpযা আপনি যা করতে চান তা। &&গ্যারান্টী যে 2nd কমান্ড যদি এবং কেবল যদি প্রথম এক স্বাভাবিকভাবে সমাপ্ত চালানো হবে।
কান

প্রশ্নে সাফল্য পূর্ব-বিদ্যমান ফাইল বি ওভাররাইট না হিসাবে সংজ্ঞায়িত করা হয় বি.টি.এম.পি ব্যবহার করা একটি প্রক্রিয়া, তবে কোনও পূর্ব-বিদ্যমান ফাইল ওভাররাইটও করতে হবে না।
ইভান বেন

আমি আমার উত্তর আপডেট। শেষ পর্যন্ত যদি আপনার ফাইলগুলি উপস্থিত থাকতে পারে বা নাও থাকতে পারে এবং একাধিক থ্রেডের পুরোপুরি 100% পারমাণবিকতার প্রয়োজন হয় তবে আপনার কোথাও একক একচেটিয়া লক প্রয়োজন (একটি বিশেষ ফাইল তৈরি করুন, বা একটি ডেটাবেস ব্যবহার করুন, বা ...) যা প্রত্যেকে তার অংশ হিসাবে অনুসরণ করছেন কপি / সরানো প্রক্রিয়া।
Kaan

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