《MySQL—事务》要点:
本文介绍了MySQL—事务,希望对您有用。如果有疑问,可以联系我们。
先来考虑一个实际的需求:
有一张“银行账户表”,现在我要让A用户给B用户转账.
此时正确的做法是:
A账户金额减少,B账户增加
此时,出现了紧急情况,设备断电,而断电的时间恰恰很巧:
A账户金额减少之后,B账户金额增加之前,发生了断电
因此,转账的金额就这么不知去向了
在“这个需求”中,我们面临继续办理的问题:
当一系连续的操作因为某些原因被打断以后出现了数据库的“纷歧致性”
“这个具体问题”解决办法是:
在一个单独的空间中,先上A账户金额减少,但此时不修改表.再让B账户金额增加,也不修改表.最后核对一下总金额与原表是否一样,如果一样则一次性修改表
事务机制是专门用来办理上述问题的数据库机制,它可以保护相关联的操作一起完成,或者一起失败
针对的对象:一系列,连续且相关的操作
原子性:一系列连续且相关的操作必需同时成功或同时失败
隔离性:当一个事务操作了表中的一行,那么在这个事务结束前,该行不能由其余会话操作
意义:保证了数据库的完整性和一致性
实现:上述所描述的“单独的空间”,其实是通过“事务日志”来实现的
为了能够让知识点直观,我们通过代码示例来演示“上述转账失败的过程”
1、创建相应的数据库
2、创建相应的表
3、插入相关数据
4、开始发工资(在没有事务机制的掩护下发生了断电)
5、再次进入数据库,查询相关的电子现金信息
id | account | name | balance |
---|---|---|---|
1 | 1111111111111111111 | Tuple | 100.00 |
2 | 0000000000000000000 | TanzhouEdu | 9992320.00 |
此时出现了无法解救的损失,电子现金消失了
自动模式(默认)
心细的同学会发现,默认情况下,我们如果向MySQL发送一条修改数据库的命令,命令执行完成后会立即修改数据库表.就像上述案例中的 UPDATE my_account SET balance=balance-7680 WHERE id=2; 一样.
此时,数据库将每一条命令当成一个单独的事务.
如果我们想要在“自动模式”下,使用“事务”,那么我们必需使用如下几个命令:
注意:一旦我们“提交”,或者“回滚”了事务,那么就视为事务结束.在事务结束的情况下,再“提交”,或者“回滚”是没有意义的
手动模式
这次,我们在“事务自动模式下”手动开始一个事务,并利用这个来完成我们转账的效果.
注意:为了保证演示效果,我们必要同时连接两个MySQL终端(会话),分别为S1和S2.
1、在S1中,开启自定义新事务
2、在S1中,开始发工资(暂时任然只做到停电前那一步)
但是我们在S2中查看金额
id | account | name | balance |
---|---|---|---|
1 | 1111111111111111111 | Tuple | 100.00 |
2 | 0000000000000000000 | TanzhouEdu | 9992320.00 |
发现,在S2中并不克不及看到S1中所做的改变.
3、接下来我们把从潭州教育财务卡中拿出的金额给Tuple老师,并提交这一系列相关的操作
4、此时我们再使用
id | account | name | balance |
---|---|---|---|
1 | 1111111111111111111 | Tuple | 7780.00 |
2 | 0000000000000000000 | TanzhouEdu | 9984640.00 |
我们发现,此时,S2才能看到这其中的修改,否则对S1的任何修改都弗成见.
这个过程中,只要我们“手动开始了一个自定义新事务”,当这个事务提交前,这个操作是放在“事务日志”中的,并不会真的影响到我们的数据库,只有当我们提交的以后才会真的修改我们的数据表.
喜欢python或者想学习python的朋友可以加QQ群:330637182!群内每天会更新python材料,还有大牛指导哟!
欢迎参与《MySQL—事务》讨论,分享您的想法,维易PHP学院为您提供专业教程。
转载请注明本页网址:
http://www.vephp.com/jiaocheng/7098.html