事务的提出

MySQL事务(transaction)主要用于处理敏感的、复杂度高的数据。处理逻辑为query语句要么一块执行,要么全部回滚。例如网上购物时,只有确认付款之后商品才会到个人账户,在此之前全部过程顾客不持有商品。
注意:MySQL事务只有在指定数据库引擎为innodb时可用。

事务的基本用法

假设用户A向用户B转账50块钱,则需要将A用户的账户余额减少50块钱,将B用户的账户添加50块钱,操作如下:

1
2
3
4
5
6
7
8
9
10
start transaction;		# 开始事务
update wallet set balance=balance-50;
# query语句错误,未写条件
rollback; # 进行回滚,撤回错误sql语句

start transaction;
update wallet set balance=balance-50 where id=1;
update wallet set balance=balance+50 where id=2;
commit; # 提交事务
# 注意:事务开启可以随时rollback,一旦commit,就不能再rollback

回滚点rollback to

1
2
3
4
5
6
7
8
start transaction;      # 开始事务
insert into wallet values(4, 1000);
savepoint four; # 设置事务回滚点
insert into wallet values(5, 199999);
savepoint five;
rollback to four;
# 回滚到回滚点four之前的事务,回滚点four之后的操作将被丢弃
commit;

事务的特性

事务的四大特性,简称ACID

  • A:atomicity,原子性,事务的所有操作为一个整体,不可再分,要么全部执行,要么全部不执行。
  • C:consistency,一致性,事务开始前或结束后,数据库所有的数据都应该是正确完整。
  • I:isolation,隔离性,每个事务都是独立的。
  • D:durability,持久性,事务一旦提交,不能再更改。