Mysql 事务
1 通俗的事务,指的是一组操作要么都成功执行,要么不成功执行,不可分割—原子性
2 在所有操作没有执行完毕之前,其他会话不能看到中间的过程---隔离性
Create table account(
Id int,
Name varchar(10),
Money int
)engine=innodb charset=utf8;
Insert into account values (1,'李三',3000),(2,'赵四',3000);
Alter table account drop money; //修改列
Alter table account add money tinyint unsigned not null default200;
Update account set money = money -100 where id =1; //给李三减去100
Update account set money = money +100 where id =2;//给赵四加上100
由于定义的是tinyint 的格式,的范围是0-255
Show variables like ‘%mode%’;
现在用的模式是严格模式,如果改成了非严格模式,它会直接截取到255,就是数值超过了255,由于上线就是255 所以直接截取到255
3 事务发生之前和发生之后,数据总额匹配(不能是相等,还兴许扣手续费呢)—一致性
4 事务已经发生了, 事务产生的影响是不能撤销的(eg:卡号输入错了,打钱给了别的人,只能通过私底下要回来只能通过一个“补偿性事务”,原来的事务也不能撤销,只能通过法院或者其他的途径要回,但是已经不是原来的事务了)---持久性
ACID 就是四种特性
事务的语法 :
alter table account CHANGE money money int;
修改money 列的数据类型是int
开启事务:
Start transaction;
表中原来的数据
Update account set money = money +500 where id =2;//给赵四加上500
Update account set money = money -500 where id =1; //给李三减去500
Sql语句必须要和开启事务在一个窗口,换一个窗口的话,事务就不生效了
执行了update 以后还是
就是在一个事务中只要是事务开启了以后就要满足事务的隔离性
Comit /rollback; 之后事务就结束了,下一次事务要重新开启
Commit 之后如下图
Start transaction;
Update account set money = money -500 where id =1;
Update account set money = money +500 where id =2;
rollback; 是什么也不会发生的
下面的方式,会自动提交
如果出现了Starttransaction; 上一个事务会自动提交 就是隐式提交
事务的基本原理为什么可以实现原子性:
原来没有应用事务的时候的原理是:
Update 语句->运行update 语句以后是直接作用到数据文件上,所以才能直接看到表的数据的变化。
用了事务以后:
Update 语句->作用到事务日志文件上(记录sql 1,sql2... 的影响)---当提交的时候才作用到表的数据文件上