MySQL MyIsam/InnoDB混合在一起的事务

在Oracle(或者, 应该说‘一般’吗?), 我们考虑Transaction(事务)这样. 你要一个决定来处理一连的操作的时候, 你用Transaction(事务)处理进程然后Commit或者Rollback.
我觉得Transaction(事务)一般是这样子.
现在我们不考虑Transaction levels和锁定.

Transaction要明确的开始和结束, 从而你要留意的是有没有不明确地结束transaction的事情. (我们现在不考虑levels和锁定)
要是你不太明白什么语句会不明确地结束transactions, 就写像Truncate不明确地把transaction结束的东西, 结果很惨, 你到那里写的进程都会被Commit.
不过, 你理解这点就没有什么难用的. (记得吗?我们现在不考虑levels和锁定哦)

因为Oracle对Schema只有一种引擎, 我们可以像上述处理.
我觉得你在Oracle上操作的时候不会留意DB引擎或存储引擎(或者只有我不知道的吗?).
另一方面, 在MySQL, 你可以按表来设置存储引擎, 这意味一个Schema(数据库)可能会有几种引擎混合在一起.
我觉得, Schema的物理设计应该按照引擎分开, 不过, 那种物理设计不一定存在.

那, 在transaction里执行MyIsam/InnoDB混合在一起的进程的话, 会怎么样?嗯嗯嗯… 不能马上回答…

唉, 太遗憾了!因此, 实验看看吧.

单步执行以下语句的时候, 也有另一个session(会话)在浏览.

① 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)

・执行之后, 从同一个会话(session)确认一下
mysql> select * from test1;
+——+
| col1 |
+——+
| 11 |
+——+
1 row in set (0.00 sec)

・从另一个会话(session)确认一下
mysql> select * from test1;
Empty set (0.01 sec)

⑤ mysql> insert into test2 values (21);
Query OK, 1 row affected (0.00 sec)

・执行之后, 从同一个会话(session)确认一下
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)

・从另一个会话(session)确认一下
mysql> select * from test1;
Empty set (0.00 sec)

mysql> select * from test2;
+——+
| col1 |
+——+
| 21 |
+——+
1 row in set (0.00 sec)

・从以上, 可以说InnoDB表还在transaction里,
另一方面, 无论是否还在transaction里, MyISAM表会自动地被commit (本来, 这概念本身不存在)
还有即使MyISAM表数据确定了, transaction仍然不会被commit或者中断.

⑥ mysql> commit;
Query OK, 0 rows affected (0.04 sec)

・从同一个会话(session)确认一下
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)

・从另一个会话(session)确认一下
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没有受中断.

・因此, 我的结论是;
・你不用担心引擎混合在一起.
・向不支持transaction的引擎发行transaction是没什么意思的, 但也没有什么害的, 所以你不需要担心 (你故意要那样做也是自由的)

嗯, 跟我想像的差不多. 即使如此, 我没有自信, 所以很好的机会实际看一看.
有机会, 我们考虑更本质的内容吧.

那, 今天到这里吧.

再见!

发表评论

电子邮件地址不会被公开。

*