所谓的事务(TRANSACTION),用白话来讲就是:
1、要执行多个步骤的SQL;
2、整个事务过程中,哪怕一步报错,整个过程反悔,就当没发生过,回溯到过去。
3、我在做事务时,外人不能影响我,我也不会影响外人。
新建一张用户余额表 user_balance
由于要使用事务,我们必须设置为 innodb 模式。
SET FOREIGN_KEY_CHECKS=0;
-- ----------------------------
-- Table structure for `user_balance`
-- ----------------------------
DROP TABLE IF EXISTS `user_balance`;
CREATE TABLE `user_balance` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`user_id` int(11) NOT NULL,
`user_money` decimal(10,2) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
理解什么是Commit
SHOW VARIABLES LIKE '%COMMIT%'
autocommit 是自动提交的意思。
事实上,我们每次执行SQL语句,系统都会默认帮我们使用Commit
命令提交。
为了方便理解和学习,我们在当前回话关闭autocommit
,使用手动提交SQL。
set autocommit = 0;
INSERT INTO user_balance(user_id, user_money) VALUES (4, 23);
# COMMIT;
由于我们关闭了自动提交,并且也没有使用COMMIT提交。
咋看之下依然是提交成功了。实际上我们查看 user_balance 表是没有新增任何内容的。
就算另起一个会话来查询也是一样的结果!
我们回到最初的会话,这时候我们使用
commit
来提交会话所有未提交的SQL。
# set autocommit = 0;
# INSERT INTO user_balance(user_id, user_money) VALUES (4, 23);
COMMIT;
这下子就正常了。