Mysql事务

2017-02-11  本文已影响0人  布尔教育

生活中我们讲求做事有始有终,特别是针对一件重要的事
编程从生活而来并高于生活
那么事务的概念也是由实际的需求而产生的

那么我们先来普及一下事务是什么?

官方解释:

事务(Transaction)是访问并可能更新数据库中各种数据项的一个程序执行单元(unit)。事务通常由高级数据库操纵语言或编程语言(如SQL,C++或Java)书写的用户程序的执行所引起,并用形如begin transactionend transaction语句(或函数调用)来界定。事务由事务开始(begin transaction)和事务结束(end transaction)之间执行的全体操作组成。

bank.jpg

联系生活:

银行转帐操作
张三需要转账给李四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;

希望该篇文章对大家有所帮助

上一篇下一篇

猜你喜欢

热点阅读