生活中我们讲求做事有始有终,特别是针对一件重要的事
编程从生活而来并高于生活
那么事务的概念也是由实际的需求而产生的
那么我们先来普及一下事务是什么?
官方解释:
事务(Transaction)是访问并可能更新数据库中各种数据项的一个程序执行单元(unit)。事务通常由高级数据库操纵语言或编程语言(如SQL,C++或Java)书写的用户程序的执行所引起,并用形如begin transaction和end transaction语句(或函数调用)来界定。事务由事务开始(begin transaction)和事务结束(end transaction)之间执行的全体操作组成。
联系生活:
银行转帐操作
张三需要转账给李四500元
这时张三的钱-500 , 李四的钱+500 **
需要执行两个update**操作 这次事务完成
事务的特点:
事务应该具有4个属性:原子性、一致性、隔离性、持久性。这四个属性通常称为ACID特性。
原子性(atomicity)。一个事务是一个不可分割的工作单位,事务中包括的诸操作要么都做,要么都不做。
一致性(consistency)。事务必须是使数据库从一个一致性状态变到另一个一致性状态。一致性与原子性是密切相关的。
隔离性(isolation)。一个事务的执行不能被其他事务干扰。即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰。
持久性(durability)。持久性也称永久性(permanence),指一个事务一旦提交,它对数据库中数据的改变就应该是永久性的。接下来的其他操作或故障不应该对其有任何影响。
存储引擎:
存储引擎要选innodb , 因为myisam不支持事务
建表:
create table t(
id int,
name char(20),
money int
)engine=innodb default charset=utf8;
插入zhangsan与lisi的数据:
insert into t values (1,'zhangsan',5000),(2,'lisi',5000);
zhangsan借给lisi500,给lisi的钱+500
update t set money=money+500 where id=2;
在另外一个窗口查看lisi的钱是否多了500
select * from t;
此时这个事务还没完成
zhangsan的钱还没减500,lisi不应该看到自己多的500
之前就有这种骗术,一个人在柜台存钱,另一个人在ATM取钱
银行职员经过一系列操作,已经将钱转过去了
存钱的人在最后一步确认签字前,告诉银行职员,自己不存钱了
而取钱的人在收到钱的时候立刻就取出来
所以为了防止这种情况的发生,我们可以开启事务,查看一下效果:
start transaction;
先查看两个人各有多少钱,再次给lisi+500
select * from t;
update t set money=money+500 where id=2;
B窗口查看lisi的钱
select * from t;
A窗口应该给zhangsan-500
update t set money=money-500 where id=1;
事务完成,A窗口结束事务
commit;
到这儿,这一整个事务才算完成.这时再去个窗口查看时就都没有问题了;
commite之后,事务就结束了
如果再想使用事务,需要重新 start transaction;
并且想在commit之前,撤回借出的钱
需要用到:rollback(回滚)
start transaction;
update t set money=money+500 where id=2;
update t set money=money-300 where id=1;
rollback;
希望该篇文章对大家有所帮助