একাধিক ব্যবহারকারীদের দ্বারা ডাটাবেস রেকর্ড সম্পাদনা

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

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

  1. Do nothing and hope that two users are never going to be editing the same record at the same time. - Might never happed but what if it does?
  2. Editing routine could store a copy of the original data as well as the updates and then compare when the user has finished editing. If they differ show user and comfirm update - Would require two copies of data to be stored.
  3. Add last updated DATETIME column and check it matches when we update, if not then show differences. - requires new column in each of the relevant tables.
  4. Create an editing table that registers when users start editing a record that will be checked and prevent other users from editing same record. - would require carful thought of program flow to prevent deadlocks and records becoming locked if a user crashes out of the program.

কোন ভাল সমাধান আছে বা আমি এই এক জন্য যেতে হবে?

0

7 উত্তর

ডাটাবেসটি আপনার জন্য এটি করবে। "আপডেটের জন্য ... নির্বাচন করুন" দেখুন, যা এই ধরনের জিনিসটির জন্য ডিজাইন করা হয়েছে। এটি আপনাকে নির্বাচিত সারিগুলিতে একটি লিখিত লক দেবে, যেটি আপনি পুনরায় বাড়াতে পারেন বা ব্যাক করুন।

0
যোগ

আপনি যদি অসম্ভব রকমের সংঘর্ষের আশা করেন, তাহলে অপটিমাইজিক কনজ্যারেন্সি সম্ভবত আপনার সেরা বাজি।

Scott Mitchell wrote a comprehensive tutorial on implementing that pattern:
Implementing Optimistic Concurrency

0
যোগ
ভাগ করে নেওয়ার জন্য ধন্যবাদ.
যোগ লেখক Pramod Gharu, উৎস

@ মার্ক হ্যারিসন: SQL সার্ভার যে সিনট্যাক্স সমর্থন করে না ( SELECT ... FOR UPDATE )।

এসকিউএল সার্ভারের সমতুল্য হল সিলেক্ট স্টেটমেন্ট ইঙ্গিত UPDLOCK

আরও তথ্যের জন্য SQL সার্ভার বুকস অনলাইন দেখুন।

0
যোগ

আরেকটি বিকল্পটি পরীক্ষা করতে হবে যে আপনি যে পরিবর্তনগুলি পরিবর্তন করছেন তার মানগুলি তখনও একই রকম ছিল যখন আপনি শুরু করেছিলেন:

SELECT 
    customer_nm,
    customer_nm AS customer_nm_orig
FROM demo_customer
WHERE customer_id = @p_customer_id

(customer_nm ক্ষেত্র প্রদর্শন করুন এবং ব্যবহারকারী এটি পরিবর্তন)

UPDATE demo_customer
SET customer_nm = @p_customer_name_new
WHERE customer_id = @p_customer_id
AND customer_name = @p_customer_nm_old

IF @@ROWCOUNT = 0
    RAISERROR( 'Update failed: Data changed' );

আপনার টেবিলে একটি নতুন কলাম যোগ করতে হবে না (এবং এটি আপ টু ডেট রাখুন), তবে আপনাকে আরো বেশি মজাদার এসকিউএল বিবৃতি তৈরি করতে হবে এবং নতুন এবং পুরানো সঞ্চিত পদ্ধতিতে ক্ষেত্রগুলি

এটি এমন রেকর্ডও রয়েছে যে আপনি রেকর্ডগুলি লক করছেনা - কারণ আমরা জানি যে রেকর্ডগুলি লক থাকা অবস্থায় শেষ হবে না যখন তারা হবে না ...

0
যোগ

একটি ক্লাসিক পদ্ধতি নিম্নরূপ:

  • add a boolean field , "locked" to each table.
  • set this to false by default.
  • when a user starts editing, you do this:

    • lock the row (or the whole table if you can't lock the row)
    • check the flag on the row you want to edit
    • if the flag is true then
      • inform the user that they cannot edit that row at the moment
    • else
      • set the flag to true
    • release the lock

    • when saving the record, set the flag back to false

0
যোগ
এই ভাল enought হয়, যদি লক = সত্য সেট, অ্যাপ্লিকেশন বা ব্রাউজার ক্র্যাশ হয়, তারপর, রেকর্ড চিরতরে মৃত তালা।
যোগ লেখক Cheung, উৎস
এই তরঙ্গ সাদা পতাকা সমাধান "সমঝোতা সংশোধন সমাধান কঠিন তাই আমি ছেড়ে চলে যাচ্ছি"
যোগ লেখক Chris Marisic, উৎস
ভাল পয়েন্ট, @ সিলভার নাইট - আপনি সঠিক সমাধান পোস্ট করতে পারেন?
যোগ লেখক AJ., উৎস
এই ক্ষেত্রে (অ্যাপ্লিকেশন / ব্রাউজার ক্র্যাশ) আপনি ForceUnlock পদ্ধতিটি অ্যাপ্লিকেশনে যোগ করতে পারেন, যা জোরপূর্বক লককে মিথ্যা হিসাবে সেট করবে।
যোগ লেখক Oleksandr, উৎস

আমার সাথে, সবচেয়ে ভাল উপায় আমার একটি কলাম শেষপর্যন্ত (টাইম্যাট্যাম্প ডেটাইপ)। যখন নির্বাচন এবং আপডেট এই মান তুলনা এই সমাধান আরেকটি অগ্রগতি হল যে আপনি সময় তথ্য পরিবর্তন হয়েছে ট্র্যাক এই কলাম ব্যবহার করতে পারেন। আমি মনে করি এটা ভাল না যদি আপনি শুধু একটি কলাম তৈরি করুন like lock চেক আপডেটের জন্য।

0
যোগ

-first create filed (update time) to store last update record -when any user select record save select time, compare between select time and update time field if( update time) > (select time) that mean another user update this record after select record

0
যোগ