Mysql 事务
什么情况下用事务:
1 事务的提出主要是为了解决并发情况下保持数据一致性的问题(类似于多线程)
事务(Transaction)是并发控制的基本单位。所谓的事务,这些操作要么都执行,要么都不执行,它是一个不可分割的工作单位。例如,银行转账工作:从一个账号扣款并使另一个账号增款,这两个操作要么都执行,要么都不执行,在关系数据库中,一个事务可以是一条SQL语句、一组SQL语句或整个程序。 。所以,应该把它们看成一个事务。事务是数据库维护数据一致性的单位,在每个事务结束时,都能保持数据一致性。
事务和程序的关系:事务和程序是两个概念。一般地讲,一个程序中包含多个事务。
针对上面的描述可以看出,
2.事务的语句
在关系数据库中,一个事务可以是一条SQL语句、一组SQL语句或整个程序。 开始事务:BEGIN TRANSACTION(事务)
提交事务:COMMIT TRANSACTION(事务)
回滚事务:ROLLBACK TRANSACTION(事务)3.事务的4个属性
Atomic(原子性):事务中包含的操作被看做一个逻辑单元,这个逻辑单元中的操作要么全部成功,要么全部失败(减款,增款必须一起完成)。
● Consistency(一致性):只有合法的数据可以被写入数据库,否则事务应该将其回滚到最初状态。事务的运行并不改变数据的一致性.例如,完整性约束了a+b=10,一个事务改变了a,那么b也应该随之改变。
● Isolation(隔离性):事务允许多个用户对同一个数据进行并发访问,而不破坏数据的正确性和完整性。同时,并行事务的修改必须与其他并行事务的修改相互独立。
● Durability(持久性):事务完成之后,它对于 系统的影响是永久的,该修改即使出现系统故障也将一直保留,真实的修改了数据库
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... 的影响)---当提交的时候才作用到表的数据文件上