Stilly

Stilly

بېكەت باشلىقى

يازمىلىرى
ئەگەشكۈچىلىرى
ئەگەشكەنلىرى
74
32
0

PHP دا MYSQL دىكى 事务 نى بىر تەرەپ قىلىش

ئاۋۋال MYSQL دىكى 事务  ھەققىدە ئازراق چۈشەنچە ھاسىل قىلايلى . 事务غا  ئەڭ ئاددىي تىلدا ئېنىقلىما بەرسەك ،بىر يۈرۈش ئۆز ئارا بېقىنىدىغان ساندان مەشخۇلاتنىڭ ئومۇمىي ئاتىلىشى .يەنى بۇ بىر يۈرۈش ساندان مەشخۇلاتىنىڭ ھەر بىرى  غەلبىلىك  تاماملانغاندا ئاندىن بىر قېتىملىق 事务 تاماملانغان بولىدۇ . دىمەك ياكى ھەممە مەشخۇلات چوقۇم غەلبىلىك بولىشى كىرەك ،ياكى ھەممە مەشخۇلات ئەسلىدىكى ھالىتىگە قايتىشى كىرەك دەپ چۈشەنساك بولىدۇ .


事务 ئەمەلىي بىر مىسال ئالايلى .

مەسىلەن بىز سىستېمىدىكى بىر ئەزانى يۇيۋەتمەكچى بولساق دەيلى 

(1) ئەزانىڭ ئاساسىي ئۇچۇرلىرىنى يۇيۋىتىشىمىز كىرەك . (ئەزا ئاساسلىق ئۇچۇرى جەدۋەلىدىن )

(2) ئەزانىڭ قوشۇمچە ئۇچۇرلىرىنى يۇيۋىتىشىمىز كىرەك ( قوشۇمچە جەدۋەلدىن )

(3) ئەزاغا مۇناسىۋەتلىك تېمىلارنى يۇيۋىتىشىمىز كىرەك .( ئەزالار يوللىغان تېمىلارنى دىمەكچىدە بۇ يەردە )

(4) ئەزاغا مۇناسىۋەتلىك ئىنكاسلارنى يۇيۋىتىشىمىز كىرەك .(ئىنكاس جەدىۋىلىدىن )

...

دىمەك يۇقارقى بىر يۈرۈش ساندان مەشخۇلاتى چوقۇم ھەممىسى غەلبىلىك بولغاندا ئاندىن ئەزا ئۆچۈرۈش مەشخۇلاتى ھەقىيقى مەنىدە تاماملانغان بولىدۇ .ناۋادا ئەزا ئاساسلىق ئۇچۇرىنى ئۆچۈرۈپ بولغان ھامانلا توك ئۆچۈپ قىلىپ ئاخىردىكى باشقا مەشخۇلاتلار تاماملانماي قالدى دەيلى ،بۇ ۋاقىتتا بىر قانچە جەدۋەلدىكى ئۇچۇرلارنىڭ ئېگىسى يوقاپ كىتىدۇ ،دىمەك بىر قاتار ئەخلەت ئۇچۇرلار ھاسىللىنىدۇ دىگەن گەپ .


يەنە بىر مىسال :

Alipayنى مىسالغا ئالساق ، A ئادەم B ئادەمگە 100 يۈەن يۆتكىمەكچى بولسا ،ئاۋۋال ئۆزىنىڭ ھىساباتىدىن 100 يۈەن چېقىم قىلىدۇ ، B ئادەمنىڭ ھىساباتىغا 100 يۈەن كىرىم بولىدۇ .دىمەك بۇ يەردە ئەڭ ئاز دىگەندە  ئىككى قېتىملىق مەشخۇلات چوقۇم غەلبىلىك بولىشى كىرەك .

(1) A ئادەمنىڭ ھىساباتىدىن 100 كوي ئازلايدۇ .

(2) B ئادەمنىڭ ھىساباتىغا 100 كوي جىقلايدۇ .

دىمەك يۇقارقىدەك مەسىلىلەرگە قارىتا MYSQL دىكى 事务 نى ئىشلىتىشنىڭ تولىمۇ زۆرۈرلىكىنى بايقايمىز .



ئەمدى php دا MYSQL دىكى  事务 نى بىر تەرەپ قىلىش توغۇرلۇق  نەق گەپنىڭ ئۆزىگە كىلەيلى . مەن ئەمەلىي تۈر ئېچىش جەريانىدا دەل يۇقارقىدەك ئەزا ئۇچۇرىنى يۇيۇش مەسىلىسىگە ئوخشاش ئىھتىياجغا دۇچ كەلدىم . (بۇ يەردە مەن yaf رامكىسى ئىشلەتكەن بولغاچ ،مۇشۇ رامكا ئاسىاسىدا 事务 ھاسىللاشنى مىسال ئالىمەن . ئەمەلىيەتتە مەيلى قانداق رامكا ئىشلىتىشمىزدىن قەتئىينەزەر ،事务 يېزىش چوڭ جەھەتتىن ئوخشىشىپ كىتىدۇ .)


ئاۋۋال تۆۋەندىكى كودقا قارايلى .


UserModel->startTrans();
//开启用户附加信息表的事务
$this->UserAttachModel->startTrans();
//开启用户相关文章表的事务
$this->ArticleModel->startTrans();
//...


//具体业务逻辑实现
$UserResult = $this->UserModel->where(['uid'=>1])->delete();
$UserAttachResult = $this->UserAttachModel->where(['user_id'=>1])->delete();
$ArticleResult = $this->ArticleModel->where(['user_id'=>1])->delete();


if ($UserResult && $UserAttachResult && $ArticleResult)
{

	//提交事务
	$this->UserModel->commit();
	$this->UserAttachModel->commit();
	$this->ArticleModel->commit();
	//其他业务
	//...

}else{

	//回滚事务
	$this->UserModel->rollback();
	$this->UserAttachModel->rollback();
	$this->ArticleModel->rollback();
	//...
}

?>


يۇقارقى كودتىكى ()startTrans نى MySql دىكى START TRANSACTION بىلەن ئوخشاش دەپ قارىساق بولىدۇ . COMMIT ۋە ROLLBACK لەرمۇ ئوخشاشلا ()commit ۋە ()rollback ئارقىلىق ئەمەلگە ئاشۇرۇلىدۇ .يۇقارقىسى پەقەت ئاددىيلا بىر مىسال .تېخىمۇ ئىچىكرلەپ تەتقىق قىلىپ بىقىشنى يەنىلا ئۆزىمىزنىڭ ئىھتىياجىغا ئاساسەن ئىزدىنىپ باقساق بولىدۇ دەپ ئويلىدىم ئۆزەمچە .


يازمىلاردا يىتەرسىلىكلەر ۋە خاتالىقلار بايقالسا تەكلىپ پىكىر بىرىشىڭلارنى سەمىمىي قارشى ئالىمەن .