ဆောင်းပါးလမ်းညွှန်
MySQL ဒေတာဘေ့စ်ငွေပေးငွေယူ rollback isolation/open concept/level processing php ထုတ်ပြန်ချက်
က MySQL ရေးရာ
MySQL အရောင်းအ၀ယ်များကို အဓိကအားဖြင့် လည်ပတ်မှုပမာဏများပြားပြီး ရှုပ်ထွေးမှုမြင့်မားသော ဒေတာများကို စီမံဆောင်ရွက်ရာတွင် အဓိကအသုံးပြုပါသည်။ဥပမာအားဖြင့်၊ ဝန်ထမ်းစီမံခန့်ခွဲမှုစနစ်တွင် လူတစ်ဦးကို ဖျက်ပါက၊ လူတစ်ဦး၏အခြေခံအချက်အလက်နှင့် စာတိုက်ပုံးများ၊ ဆောင်းပါးများစသည်ဖြင့် လူနှင့်သက်ဆိုင်သည့် အချက်အလက်နှစ်ခုလုံးကို ဖျက်ပစ်ရန်လိုအပ်ပါသည်။ အရောင်းအ၀ယ်ပြုလုပ်သည် !
- Innodb ဒေတာဘေ့စ်အင်ဂျင်ကို အသုံးပြုသည့် ဒေတာဘေ့စ်များ သို့မဟုတ် ဇယားများအတွက်သာ MySQL တွင် ငွေပေးချေမှုများကို ပံ့ပိုးပေးပါသည်။
- SQL statements အစုအဝေးများအားလုံးကို executed သို့မဟုတ် ၎င်းတို့ထဲမှ တစ်ခုမျှ လုပ်ဆောင်ခြင်းမရှိကြောင်း သေချာစေရန် ဒေတာဘေ့စ်၏ ခိုင်မာမှုကို ထိန်းသိမ်းရန် ငွေပေးငွေယူ လုပ်ဆောင်ခြင်းကို အသုံးပြုနိုင်သည်။
- ငွေပေးချေမှုများကို ထည့်သွင်းခြင်း၊ အပ်ဒိတ်လုပ်ခြင်း၊ ဖျက်ခြင်းတို့ကို စီမံခန့်ခွဲရန် အသုံးပြုပါသည်။
ယေဘူယျအားဖြင့်ပြောရလျှင်၊ ငွေပေးငွေယူတစ်ခုသည် အခြေအနေ 4 ခု (ACID) နှင့် ကိုက်ညီရမည်- Atomicity (atomicity), Consistency (တည်ငြိမ်), Isolation (isolation), Durability (ယုံကြည်စိတ်ချရမှု)၊
- 1,အရောင်းအ၀ယ်များ၏ အနုမြူစနစ်-အောင်မြင်သည်ဖြစ်စေ ရုပ်သိမ်းသည့် အရောင်းအဝယ်အစုတစ်ခု။
- 2,တည်ငြိမ်မှုတရားမဝင် ဒေတာ (နိုင်ငံခြား သော့ချက် ကန့်သတ်ချက်များ နှင့် အခြားအရာများ) ရှိ၍ ငွေလွှဲခြင်းကို ရုပ်သိမ်းပါသည်။
- 3,သီးသန့်ထားခြင်း၊ ခွဲထားခြင်း:ငွေပေးငွေယူများကို လွတ်လပ်စွာလုပ်ဆောင်သည်။ငွေပေးငွေယူတစ်ခု၏ရလဒ်သည် အခြားငွေပေးငွေယူများအပေါ် သက်ရောက်ပါက၊ အခြားငွေပေးငွေယူများကို ရုပ်သိမ်းပါမည်။မြန်နှုန်း၏ကုန်ကျစရိတ်ဖြင့် ငွေပေးငွေယူများကို 100% သီးခြားခွဲထားသည်။
- 4,ယုံကြည်စိတ်ချရမှု-ဆော့ဖ်ဝဲလ်နှင့် ဟာ့ဒ်ဝဲ ပျက်ကျပြီးနောက်၊ InnoDB ဒေတာဇယား ယာဉ်မောင်းသည် ၎င်းကို ပြန်လည်တည်ဆောက်ရန်နှင့် ပြင်ဆင်ရန် မှတ်တမ်းဖိုင်ကို အသုံးပြုမည်ဖြစ်သည်။ယုံကြည်စိတ်ချရမှုနှင့် မြင့်မားသောအမြန်နှုန်း နှစ်မျိုးလုံးမရနိုင်ပါ၊ innodb_flush_log_at_trx_commit option သည် ငွေပေးငွေယူများကို မှတ်တမ်းတွင် မည်သည့်အချိန်တွင် သိမ်းဆည်းရမည်နည်း။
MySQL အမိန့်ပေးစာကြောင်း၏ ပုံသေဆက်တင်များအောက်တွင်၊ ငွေပေးငွေယူများကို အလိုအလျောက် ကတိပြုပါသည်၊ ဆိုလိုသည်မှာ SQL ကြေညာချက်ကို လုပ်ဆောင်ပြီးနောက် COMMIT လုပ်ဆောင်ချက်ကို ချက်ချင်းလုပ်ဆောင်ပါမည်။ထို့ကြောင့်၊ ငွေပေးငွေယူတစ်ခုအား ပြတ်သားစွာဖွင့်ရန် BEGIN သို့မဟုတ် START TRANSACTION၊ သို့မဟုတ် SET AUTOCOMMIT=0 ဟူသော command ကို အသုံးပြု၍ လက်ရှိ session အတွက် အလိုအလျောက် commit ကိုအသုံးပြုခြင်းကို ပိတ်ရန် လိုအပ်ပါသည်။
ငွေပေးငွေယူ ထိန်းချုပ်မှု ကြေညာချက်-
- ငွေပေးငွေယူ စတင်ခြင်း သို့မဟုတ် စတင်ခြင်း ၊ အရောင်းအ၀ယ်တစ်ခုကို အတိအလင်း စတင်ပါ။
- COMMIT၊ COMMIT WORK ကိုလည်း သုံးနိုင်သော်လည်း နှစ်ခုသည် တူညီပါသည်။ COMMIT သည် ငွေပေးငွေယူကို ကတိပြုပြီး ဒေတာဘေ့စ်သို့ ပြုပြင်မွမ်းမံမှုများအားလုံးကို အမြဲတမ်းပြုလုပ်သည်။
- ROLLBACK၊ ROLLBACK WORK ကိုသုံးနိုင်သော်လည်း နှစ်ခုသည် ညီမျှသည်။Rollback သည် အသုံးပြုသူ၏ ငွေပေးငွေယူကို အဆုံးသတ်ပြီး ကတိက၀တ်မပြုသော ပြုပြင်မွမ်းမံမှုများအားလုံးကို ပြန်လည်လုပ်ဆောင်နေပါသည်။
- SavePOINT identifier၊ SavePOINT သည် ငွေပေးငွေယူတစ်ခုတွင် savepoint တစ်ခုကို ဖန်တီးနိုင်ကာ ငွေပေးငွေယူတစ်ခုတွင် SAVEPOINT အများအပြားရှိနိုင်သည်။
- SavePOINT identifier ကို ထုတ်ဝေပါ၊ သတ်မှတ်ထားသော savepoint မရှိသောအခါ၊ ငွေပေးငွေယူတစ်ခု၏ savepoint ကို ဖျက်ပါ၊ ကြေငြာချက်ကို အကောင်အထည်ဖော်ခြင်းသည် ခြွင်းချက်တစ်ခုဖြစ်သည်။
- အမှတ်အသားပြုရန် လှည့်ပါ၊ ငွေပေးငွေယူကို အမှတ်သို့ ပြန်လှည့်ပါ။
- ငွေပေးငွေယူသတ်မှတ်ခြင်း၊ ငွေပေးငွေယူ၏ သီးခြားခွဲထုတ်ခြင်းအဆင့်ကို သတ်မှတ်ရန် အသုံးပြုသည်။ InnoDB သိုလှောင်မှုအင်ဂျင်မှ ပံ့ပိုးပေးသော ငွေပေးငွေယူ အထီးကျန်အဆင့်များသည် ဖတ်ရှုရန် ကွန်မန့်မထားသော၊ ဖတ်ရှုရန် ကတိကဝတ်ပြုထားသော၊ ထပ်ခါတလဲလဲ ဖတ်ရှုနိုင်သော၊ နှင့် ဆက်တိုက်လုပ်ဆောင်နိုင်သည်။
MYSQL အရောင်းအ၀ယ်လုပ်ဆောင်ခြင်း၏ အဓိကနည်းလမ်းနှစ်ခုရှိသည်။
1. အောင်မြင်ရန် BEGIN၊ ROLLBACK၊ COMMIT ကိုသုံးပါ။
- အစ ငွေပေးငွေယူတစ်ခုစတင်ပါ။
- နောက်ပြန်လိမ့်သည် ငွေပေးငွေယူ rollback
- ကတိကဝတ် ငွေသွင်းငွေထုတ် အတည်ပြုချက်
2. MySQL ၏ အလိုအလျောက်လုပ်ဆောင်မှုမုဒ်ကို ပြောင်းလဲရန် SET ကို တိုက်ရိုက်အသုံးပြုပါ-
- AUTOCOMMIT=0 သတ်မှတ်ရန် အလိုအလျောက် ကွန်မန့်ကို ပိတ်ပါ။
- AUTOCOMMIT=1 သတ်မှတ်ရန် အလိုအလျောက် ကတိပြုခြင်းကို ဖွင့်ပါ။
ငွေပေးငွေယူစမ်းသပ်မှု
mysql> use chenweiliang; Database changed mysql> CREATE TABLE chenweiliang_transaction_test( id int(5)) engine=innodb; # 创建数据表 Query OK, 0 rows affected (0.04 sec) mysql> select * from chenweiliang_transaction_test; Empty set (0.01 sec) mysql> begin; # 开始事务 Query OK, 0 rows affected (0.00 sec) mysql> insert into chenweiliang_transaction_test value(5); Query OK, 1 rows affected (0.01 sec) mysql> insert into chenweiliang_transaction_test value(6); Query OK, 1 rows affected (0.00 sec) mysql> commit; # 提交事务 Query OK, 0 rows affected (0.01 sec) mysql> select * from chenweiliang_transaction_test; +------+ | id | +------+ | 5 | | 6 | +------+ 2 rows in set (0.01 sec) mysql> begin; # 开始事务 Query OK, 0 rows affected (0.00 sec) mysql> insert into chenweiliang_transaction_test values(7); Query OK, 1 rows affected (0.00 sec) mysql> rollback; # 回滚 Query OK, 0 rows affected (0.00 sec) mysql> select * from chenweiliang_transaction_test; # 因为回滚所以数据没有插入 +------+ | id | +------+ | 5 | | 6 | +------+ 2 rows in set (0.01 sec) mysql>
PHP တွင် Transaction Instances ကိုအသုံးပြုခြင်း။
စမ်းသပ်မှုအားဖြင့် MySQL မှာယူမှု-
<?
php
$dbhost = 'localhost:3306'; // mysql服务器主机地址
$dbuser = 'root'; // mysql用户名
$dbpass = '123456'; // mysql用户名密码
$conn = mysqli_connect($dbhost, $dbuser, $dbpass);
if(! $conn )
{
die('连接失败: ' . mysqli_error($conn));
}
// 设置编码,防止中文乱码
mysqli_query($conn, "set names utf8");
mysqli_select_db( $conn, 'chenweiliang' );
mysqli_query($conn, "SET AUTOCOMMIT=0"); // 设置为不自动提交,因为MYSQL默认立即执行
mysqli_begin_transaction($conn); // 开始事务定义
if(!mysqli_query($conn, "insert into chenweiliang_transaction_test (id) values(8)"))
{
mysqli_query($conn, "ROLLBACK"); // 判断当执行失败时回滚
}
if(!mysqli_query($conn, "insert into chenweiliang_transaction_test (id) values(9)"))
{
mysqli_query($conn, "ROLLBACK"); // 判断执行失败时回滚
}
mysqli_commit($conn); //执行事务
mysqli_close($conn);
?>မျှော်လင့်ခြင်း Chen Weiliang ဘလော့ဂ် ( https://www.chenweiliang.com/ ) သင့်အတွက် အထောက်အကူဖြစ်စေသော "MySQL Database Transaction Rollback Isolation/Open Concept/Level Processing of PHP Statements" ကို မျှဝေထားသည်။
ဤဆောင်းပါး၏ link ကိုမျှဝေရန်ကြိုဆိုပါတယ်:https://www.chenweiliang.com/cwl-494.html
