首页 > 技术文章 > MySQL事务

zhony 2019-01-03 19:19 原文

1.了解事务的概念。
比如:银行转帐
张三 ---> 转账给李四500元
张三的钱-500;李四的钱+500;
两个update操作 这次事务才算完成,这就叫一次事务。

那:张三的钱刚-500,打雷闪电机房断电,李四的钱还没加上
最终这500快哪去了???
日常生活中,汇款两字包含两个小动作,1扣张三的钱,2加李四的钱。
汇款成功,那扣钱和增加钱都需完成才算汇款成功,事物就是给你一种保证,什么样的保证呢?

要么让你都完成,要么让你都不完成,从而保证你数据的安全性
否则,张三钱少了,李四没收到钱...两人决裂了
如何保证一个或者一次事务的完整性?

事务要选择innodb引擎,之前建表都使用myisam引擎,但它速度是稍微快快点,但不支持事务。

1 CREATE TABLE t29(
2 id INT,
3 name CHAR(10),
4 money int
5 )ENGINE=innodb DEFAULT CHARSET=utf8;

插入zhangsan和lisi的数据

INSERT INTO t29 VALUES (1,'zhangsan',5000),(2,'lisi',5000);

zhangsan借给lisi500,给lisi的钱+500

UPDATE t29 SET money=money+500 where id=2;

在另外一个B窗⼝查看lisi的钱是否多了500

1 select * from t29;

这个事务还没完成,zhangsan的钱还没减500,lisi不应该看到自己多的500
A窗口启用事务,看看是什么样的效果

start transaction;

先查看连个人各有多少钱,再次给lisi+500

1 select * from t29;
2 update t29 set money=money+500 where id=2;

B窗口查看lisi的钱

1 select * from t29;

A窗口应该给zhangsan-500

update t29 set money=money-500 where id=1;

B窗口查看t29

select * from t29;

事务完成,A窗口结束事务

commit;

zhangsan继续借给了lisi50

1 update t29 set money=money+500 where id=2;
2 update t29 set money=money-500 where id=1;

结果在commit之前,想撤销借出的钱
需要用到:回滚 rollback;

1 rollback;
2 select * from t29;

 

推荐阅读