æ谢大佬çå¿åå¤ï¼è¿æ ·è¯´tp5.1çé»è®¤çæ件sessionåå¨çå¾ è¿ç¨å¤çç»æåæcloseæ¯ææè为ä¹?
ä½æ¯æç代ç 并ä¸ååï¼é 置项ä¸use_lock=trueä¸è¿ä¹æä½ï¼ä¸æ¯åºè¯¥ä½¿ç¨use_lock=trueæè¿æ ·åï¼æä¹ç¸åäºãå¦ä¸å ³é®ä»£ç 段ï¼
/thinkphp/library/think/Session.php:123:
public function init(array $config = [])
{
$config = $config ?: $this->config;
$isDoStart = false;
if (isset($config['use_trans_sid'])) {
ini_set('session.use_trans_sid', $config['use_trans_sid'] ? 1 : 0);
}
// å¯å¨session
if (!empty($config['auto_start']) && PHP_SESSION_ACTIVE != session_status()) {
ini_set('session.auto_start', 0);
$isDoStart = true;
}
if (isset($config['prefix'])) {
$this->prefix = $config['prefix'];
}
if (isset($config['use_lock'])) {
$this->lock = $config['use_lock']; //è¿éåå§å
}
/thinkphp/library/think/Session.php:348:
protected function unlock()
{
if (empty($this->lock)) {
return;
}
$this->pause(); //è¿éé¢ææ§è¡ session_write_close();
if ($this->lockDriver && method_exists($this->lockDriver, 'unlock')) {
$sessID = isset($_COOKIE[$this->sessKey]) ? $_COOKIE[$this->sessKey] : '';
$this->lockDriver->unlock($sessID);
}
}
å¦å¤ï¼è¯·æä¸ã对äºåä¸ç¨æ·ï¼ä¸ç¨sessionæ件éæ¹å¼ï¼éå¶ä¸²è¡è®¿é®æ并è¡è®¿é®ï¼ç±äºè¯»æ°æ®ä¸åæ¥é æçä¹±æ°æ®ãå¦ä¸ä¸å¡æ åµï¼
æµè¯SQLï¼
-- ----------------------------
-- Table structure for order
-- ----------------------------
DROP TABLE IF EXISTS `order`;
CREATE TABLE `order` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`user_id` int(11) NOT NULL,
`payment_status` tinyint(2) NOT NULL COMMENT '0æªæ¯ä»1å·²æ¯ä»',
PRIMARY KEY (`id`),
KEY `idx_user_id` (`user_id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
-- ----------------------------
-- Records of order
-- ----------------------------
BEGIN;
INSERT INTO `order` VALUES (1, 1, 0);
COMMIT;
-- ----------------------------
-- Table structure for order_payment
-- ----------------------------
DROP TABLE IF EXISTS `order_payment`;
CREATE TABLE `order_payment` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`order_id` int(11) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
SET FOREIGN_KEY_CHECKS = 1;
Aäºå¡
Bäºå¡
begin
begin
æ¥æ¾ç¨æ·æ¯å¦æ¯ä» select id,payment_status from order where user_id = 1ï¼å¾å°payment_status=0æªæ¯ä»
订åæªæ¯ä» æ¯ä»todo æ·»å æ¡æ¯ä»è®°å½ï¼å¹¶æ´æ¹ç¶æ insert into order_payment(order_id) VALUES(1);update order set payment_status = 1 where id = 1;
æ¥æ¾ç¨æ·æ¯å¦æ¯ä» select id,payment_status from order where user_id = 1ï¼å¾å°payment_status=0æªæ¯ä»
commit
订åæªæ¯ä» æ¯ä»todo æ·»å æ¡æ¯ä»è®°å½ï¼å¹¶æ´æ¹ç¶æ insert into order_payment(order_id) VALUES(1);update order set payment_status = 1 where id = 1;
commit
ç»è®ºï¼å¨é»è®¤çRRäºå¡çº§å«ä¸ï¼ç±äºä¸²è¡æ并è¡è¯»å¼èµ·ç订åæ¯ä»è®°å½å¤äºä¸æ¡ã
为äºè§£å³ä¸é¢çä¸å¡ï¼ææ³çæ两ç§è§£å³æ¹æ¡ ï¼
1ãå¯ä»¥ç¨innodbé»è®¤é离级å«RRå äºæ¥éfor updateå¤ç(è¿ä¸ªå¥½åä¼äº§çæ»é)
2ãç¨redisçsetååç¹æ§å éãè¿è¡åç¨æ·å ¨å±é
ä¸ç¥éè¿æ没æå ¶ä»æ´å¥½ç解å³æ¹æ¡