一、事务的提出
购买商品时点击支付,并未付款,
思考此时数据库的变化是怎样的?
也就是说,某些时候,
需要我们确定某事物之后再更新数据库。
因此引入————事务(transaction)
二、transaction
创建一个钱包表:
开始一个事务:
START TRANSACTION;
让1号用户金额减50:
UPDATE wallet SET balance=balance-50 WHERE id=1;
让2号用户金额加50:
UPDATE wallet SET balance=balanc+50 WHERE id=2;
提交事务,完成转账操作:
COMMIT;
开始一个新的事务:
START TRANSACTION;
UPDATE wallet SET balance=balance+20;
不想进行当前操作时,进行事务回滚:
ROLLBACK;
此时数据表没有发生变化。
注意:一旦commit以后就不能再rollback回滚
三、rollback to回滚点
参考虚拟机中的快照、git中的回滚
开始一个事务:
START TRANSACTION;
在钱包表中插入一条数据:
INSERT INTO wallet VALUES(4,1000);
设置一个回滚点:
SAVEPOINT four;
再在钱包表中插入一条数据:
INSERT INTO wallet VALUES(5,199999);
设置下一个回滚点:
SAVEPOINT five;
此时发现第二次插入的数据不正确
回滚至上一个回滚点:
ROLLBACK TO four;
提交事务,完成操作:
COMMIT;
四、ACID
A:atomicity(原子性)
C:consistency(一致性)
I:isolation(隔离性)
D:durability(持久性)
五、注意
只有创建数据库时指定:
数据库引擎为 innodb 才能使用事务。