所谓的事务(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;

这下子就正常了。

results matching ""

    No results matching ""