cas
(কাঁচের Workerman সংস্করণ >= 3.3.0)
bool \GlobalData\Client::cas(string $key, mixed $old_value, mixed $new_value)
পারমাণবিক প্রতিস্থাপন, $old_value কে $new_value দ্বারা প্রতিস্থাপন করুন।
শুধুমাত্র বর্তমান ক্লায়েন্টের সর্বশেষ মান গ্রহণের পরে, যদি সেই key এর জন্য মানটি অন্য কোনো ক্লায়েন্ট দ্বারা পরিবর্তিত না হয়, তবেই এটি লিখতে সক্ষম হবে।
প্যারামিটার
$key
কী মান। (যেমন $global->abc যেখানে abc হলো কী মান)
$old_value
পুরানো তথ্য
$new_value
নতুন তথ্য
রিটার্ন ভ্যালু
পরিবর্তন সফল হলে true ফেরত দেবে, নাহলে false।
ব্যাখ্যা:
একাধিক প্রক্রিয়া একই ভাগ করা ভেরিয়েবল simultaneouly অপারেশনের সময়, কখনও কখনও প্রতিক্রিয়ার সমস্যা বিবেচনা করতে হবে।
যেমন, A এবং B দুইটি প্রক্রিয়া একসাথে ব্যবহারকারী তালিকায় একটি সদস্য যোগ করছে।
A এবং B প্রক্রিয়ার বর্তমান ব্যবহারকারী তালিকাগুলি হলো $global->user_list = array(1,2,3)।
A প্রক্রিয়া $global->user_list ভেরিয়েবলটি পরিচালনা করে, একটি ব্যবহারকারী 4 যোগ করছে।
B প্রক্রিয়া $global->user_list ভেরিয়েবলটি পরিচালনা করে, একটি ব্যবহারকারী 5 যোগ করছে।
A প্রক্রিয়া $global->user_list = array(1,2,3,4) সেট করতে সফল হলো।
B প্রক্রিয়া $global->user_list = array(1,2,3,5) সেট করতে সফল হলো।
এখন B প্রক্রিয়ার সেট করা ভেরিয়েবল A প্রক্রিয়ার সেট করা ভেরিয়েবলকে ওভাররাইট করছে, যার ফলে ডেটা হারিয়ে যাচ্ছে।
এটি ঘটছে কারণ পড়া এবং সেট করা একটি পরমাণু অপারেশন নয়, যা প্রতিক্রিয়ার সমস্যা সৃষ্টি করছে।
এমন প্রতিক্রিয়ার সমস্যা সমাধানের জন্য, cas পারমাণবিক প্রতিস্থাপন ইন্টারফেস ব্যবহার করা যেতে পারে।
cas ইন্টারফেস একটি মান পরিবর্তন করার আগে,
$old_value কে দেখে নির্ধারণ করবে যে এই মানটি অন্য প্রক্রিয়া দ্বারা পরিবর্তিত হয়েছে কিনা,
যদি পরিবর্তিত হয়ে থাকে তবে এটি প্রতিস্থাপন করবে না, false ফেরত দেবে। অন্যথায়, true ফেরত দেবে।
নীচে উদাহরণ দেখুন।
注意:
কিছু ভাগ করা তথ্যের প্রতিক্রিয়া ওভাররাইট করা সমস্যা নেই, যেমন একটি নিলাম ব্যবস্থা যেখানে একটি নিলামের বর্তমান সর্বোচ্চ বিড, যেমন একটি পণ্য যেখানে বর্তমান স্টক ইত্যাদি।
উদাহরণ
$global = new GlobalData\Client('127.0.0.1:2207');
// তালিকা শুরুর
$global->user_list = array(1,2,3);
// user_list এ একটি মান পারমাণবিকভাবে যোগ করুন
do
{
$old_value = $new_value = $global->user_list;
$new_value[] = 4;
}
while(!$global->cas('user_list', $old_value, $new_value));
var_export($global->user_list);