摘要:最后的执行结果,由于表使用了不支持事务的引擎,所以,上述语句对表数据的操作被真正的执行了,也就是说,表中第一条数据中小明的公司地址被改成了小明的第二家公司地址,而其它两个表的数据没有发生任何变化。
作者:Terry Gao
首先,我只在Mysql中做了测试,其它数据库各位读者如果有兴趣可以自己试试。
1. 创建测试数据首先新建三张表:user、company、school。我们知道InnoDB引擎是支持事务的,而MyISAM引擎不支持事务,因此,在这里,我使用InnoDB作为user和school两个表的引擎,而使用MyISAM作为company的引擎。三个表结构很简单,数据类型什么的我就不放出来了,把表数据列在下面。
user表(InnoDB):
id | name | age |
---|---|---|
1 | 小明 | 18 |
2 | 小李 | 19 |
3 | 小张 | 20 |
company表(MyISAM):
id | name | age |
---|---|---|
1 | 小明的公司 | 小明的公司地址 |
2 | 小李的公司 | 小李的公司地址 |
3 | 小张的公司 | 小张的公司地址 |
school表(InnoDB):
id | name | age |
---|---|---|
1 | 小明的学校 | 小明的学校地址 |
2 | 小李的学校 | 小李的学校地址 |
3 | 小张的学校 | 小张的学校地址 |
我们执行如下sql:
BEGIN; UPDATE user set age = "22" where id = 1; UPDATE company set address = "小明的第二家公司地址" where id = 1; UPDATE school set address = "小明的中学地址" where id = 1; ROLLBACK;
上面的sql首先通过BEGIN启动一个事务,然后将user表中id为1的数据中age字段的值改为22,再将company表中id为1的数据中address字段的值改为‘小明的第二家公司’,第三条语句是将school表中id为1的数据中address字段的值改为‘小明的中学地址’,最后我们并不执行COMMIT来保存更改,而是使用ROLLBACK来回滚操作,看看是否都能正确回滚。
最后的执行结果,由于company表使用了不支持事务的MyISAM引擎,所以,上述语句对company表数据的操作被真正的执行了,也就是说,company表中第一条数据中“小明的公司地址”被改成了“小明的第二家公司地址”,而其它两个表的数据没有发生任何变化。
3. 总结我们在平时的工作中,如果涉及到数据库事务操作,一定要对库和表的性质特性了解清楚,以防一些不支持事务的库和表,影响了事务操作的原子性。
如果你有任何问题或建议,可以扫描下方二维码或者微信搜索[phpjiagoushier],关注我的微信公众号[PHP架构],与我交流互动。
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/17599.html
阅读 2650·2021-11-25 09:43
阅读 670·2021-11-12 10:36
阅读 4615·2021-11-08 13:18
阅读 2168·2021-09-06 15:00
阅读 3106·2019-08-30 15:56
阅读 924·2019-08-30 13:57
阅读 1985·2019-08-30 13:48
阅读 1413·2019-08-30 11:13