mysql innodb myisam 混合,MySQL MyIsam/InnoDB混合在一起的事务
在Oracle(或者, 應(yīng)該說(shuō)‘一般’嗎?), 我們考慮Transaction(事務(wù))這樣. 你要一個(gè)決定來(lái)處理一連的操作的時(shí)候, 你用Transaction(事務(wù))處理進(jìn)程然后Commit或者Rollback.
我覺得Transaction(事務(wù))一般是這樣子.
現(xiàn)在我們不考慮Transaction levels和鎖定.
Transaction要明確的開始和結(jié)束, 從而你要留意的是有沒有不明確地結(jié)束transaction的事情. (我們現(xiàn)在不考慮levels和鎖定)
要是你不太明白什么語(yǔ)句會(huì)不明確地結(jié)束transactions, 就寫像Truncate不明確地把transaction結(jié)束的東西, 結(jié)果很慘, 你到那里寫的進(jìn)程都會(huì)被Commit.
不過, 你理解這點(diǎn)就沒有什么難用的. (記得嗎?我們現(xiàn)在不考慮levels和鎖定哦)
因?yàn)镺racle對(duì)Schema只有一種引擎, 我們可以像上述處理.
我覺得你在Oracle上操作的時(shí)候不會(huì)留意DB引擎或存儲(chǔ)引擎(或者只有我不知道的嗎?).
另一方面, 在MySQL, 你可以按表來(lái)設(shè)置存儲(chǔ)引擎, 這意味一個(gè)Schema(數(shù)據(jù)庫(kù))可能會(huì)有幾種引擎混合在一起.
我覺得, Schema的物理設(shè)計(jì)應(yīng)該按照引擎分開, 不過, 那種物理設(shè)計(jì)不一定存在.
那, 在transaction里執(zhí)行MyIsam/InnoDB混合在一起的進(jìn)程的話, 會(huì)怎么樣?嗯嗯嗯… 不能馬上回答…
唉, 太遺憾了!因此, 實(shí)驗(yàn)看看吧.
單步執(zhí)行以下語(yǔ)句的時(shí)候, 也有另一個(gè)session(會(huì)話)在瀏覽.
① create table test1 ( col1 int ) engine=InnoDB;
② create table test2 ( col1 int ) engine=MyISAM;
③ start transaction;
④ insert into test1 values (11);
⑤ insert into test2 values (21);
⑥ commit;
① mysql> create table test1 ( col1 int ) engine=InnoDB;
Query OK, 0 rows affected (0.05 sec)
mysql> show create table test1;
+——-+——————————————————————————————-+
| Table | Create Table |
+——-+——————————————————————————————-+
| test1 | CREATE TABLE `test1` (
`col1` int(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 |
+——-+——————————————————————————————-+
1 row in set (0.00 sec)
② mysql> create table test2 ( col1 int ) engine=MyISAM;
Query OK, 0 rows affected (0.05 sec)
mysql> show create table test2;
+——-+——————————————————————————————-+
| Table | Create Table |
+——-+——————————————————————————————-+
| test2 | CREATE TABLE `test2` (
`col1` int(11) DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8 |
+——-+——————————————————————————————-+
1 row in set (0.00 sec)
③ mysql> start transaction;
Query OK, 0 rows affected (0.00 sec)
④ mysql> insert into test1 values (11);
Query OK, 1 row affected (0.01 sec)
?執(zhí)行之后, 從同一個(gè)會(huì)話(session)確認(rèn)一下
mysql> select * from test1;
+——+
| col1 |
+——+
| 11 |
+——+
1 row in set (0.00 sec)
?從另一個(gè)會(huì)話(session)確認(rèn)一下
mysql> select * from test1;
Empty set (0.01 sec)
⑤ mysql> insert into test2 values (21);
Query OK, 1 row affected (0.00 sec)
?執(zhí)行之后, 從同一個(gè)會(huì)話(session)確認(rèn)一下
mysql> select * from test1;
+——+
| col1 |
+——+
| 11 |
+——+
1 row in set (0.00 sec)
mysql> select * from test2;
+——+
| col1 |
+——+
| 21 |
+——+
1 row in set (0.00 sec)
?從另一個(gè)會(huì)話(session)確認(rèn)一下
mysql> select * from test1;
Empty set (0.00 sec)
mysql> select * from test2;
+——+
| col1 |
+——+
| 21 |
+——+
1 row in set (0.00 sec)
?從以上, 可以說(shuō)InnoDB表還在transaction里,
另一方面, 無(wú)論是否還在transaction里, MyISAM表會(huì)自動(dòng)地被commit (本來(lái), 這概念本身不存在)
還有即使MyISAM表數(shù)據(jù)確定了, transaction仍然不會(huì)被commit或者中斷.
⑥ mysql> commit;
Query OK, 0 rows affected (0.04 sec)
?從同一個(gè)會(huì)話(session)確認(rèn)一下
mysql> select * from test1;
+——+
| col1 |
+——+
| 11 |
+——+
1 row in set (0.00 sec)
mysql> select * from test2;
+——+
| col1 |
+——+
| 21 |
+——+
1 row in set (0.00 sec)
?從另一個(gè)會(huì)話(session)確認(rèn)一下
mysql> select * from test1;
+——+
| col1 |
+——+
| 11 |
+——+
1 row in set (0.00 sec)
mysql> select * from test2;
+——+
| col1 |
+——+
| 21 |
+——+
1 row in set (0.00 sec)
?從以上, 可以理解在⑤transaction沒有受中斷.
?因此, 我的結(jié)論是;
?你不用擔(dān)心引擎混合在一起.
?向不支持transaction的引擎發(fā)行transaction是沒什么意思的, 但也沒有什么害的, 所以你不需要擔(dān)心 (你故意要那樣做也是自由的)
嗯, 跟我想像的差不多. 即使如此, 我沒有自信, 所以很好的機(jī)會(huì)實(shí)際看一看.
有機(jī)會(huì), 我們考慮更本質(zhì)的內(nèi)容吧.
那, 今天到這里吧.
再見!
總結(jié)
以上是生活随笔為你收集整理的mysql innodb myisam 混合,MySQL MyIsam/InnoDB混合在一起的事务的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 华夏银行信用卡临时额度有效期多久?到期后
- 下一篇: 建行信用卡积分兑换话费多久到账?没到账怎