事务
什么是事务
要么都成功,要么都失败
1.sql执行 A给B转账 A 1000 ->200 B200
2.sql执行 B收到的前 A800 ->B400
- 原子性(Atomicity):表示上方所说1和2这2个步骤要么一起成功,或者一起失败,不能只发生其中一个动作
- 一致性(Consistency):针对一个事务操作与操作后的状态一致,最终一致性 ,无论怎么转账最后的的值一定是初始总值
- 持久性(Durability):事务没有提交,就恢复到原状,事物已经提交,持久化到数据库,事务一旦提交就不可逆
- 隔离性(lsolation):多个用户同时操作时,互不影响,比如A给b转,C也给b转,是独立开来的 如果隔离失败
- 脏读:一个事务读取了另一个为提交的数据,比如C有200,A转B200,C转B100,先读取了C转B的100
2.不可重复读,在一个事务已经提交完数据后,又有人转钱(不一定错误,看场合)
3.虚读(幻读):读取到了别人的事,导致多了一行数据
执行事务
- mysql 是默认开启事务自动提交的
- 关闭事务
set autocomit=0
- 开启事务(默认的)
set autocomit=1
- 事务开启
start transaction
标记一个事务的开始,从这个之后的sql都在同一个事物内 commit
提交:持久化(成功!)rollback
回滚:回到的原来的样子(失败!)savepoint
保存点名-设置一个事务的保存点rollback to savepoint
保存点名-回滚到保存点(像是游戏里死亡后存档)release savepoint
撤销保存点
网络异常,图片无法展示
|
模拟场景
CREATE TABLE `account`( `id` INT (3) NOT NULL AUTO_INCREMENT, `name` VARCHAR(30) NOT NULL, `money` DECIMAL(9,2) NOT NULL, PRIMARY KEY (`id`) )ENGINE= INNODB DEFAULT CHARSET=utf8
网络异常,图片无法展示
|
-- 模拟转张:事务
SET autocommit =0; 关闭自动提交 START TRANSACTION 开启一个事务 UPDATE account SET money=money-500 WHERE `name`='A' A-500 UPDATE account SET money=money+500 WHERE `name`='B' B+500 COMMIT; 提交事务,就被持久化了 ROLLBACK; 回滚,如果未提交事务则被恢复到初始值 SET autocommit =1; 恢复默认值
网络异常,图片无法展示
|