摘要:最后的執行結果,由于表使用了不支持事務的引擎,所以,上述語句對表數據的操作被真正的執行了,也就是說,表中第一條數據中小明的公司地址被改成了小明的第二家公司地址,而其它兩個表的數據沒有發生任何變化。
作者: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架構],與我交流互動。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/17599.html
閱讀 2658·2021-11-25 09:43
閱讀 678·2021-11-12 10:36
閱讀 4636·2021-11-08 13:18
閱讀 2184·2021-09-06 15:00
閱讀 3121·2019-08-30 15:56
閱讀 936·2019-08-30 13:57
閱讀 1994·2019-08-30 13:48
閱讀 1422·2019-08-30 11:13