在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是没什么意思的, 但也没有什么害的, 所以你不需要担心 (你故意要那样做也是自由的)
嗯, 跟我想像的差不多. 即使如此, 我没有自信, 所以很好的机会实际看一看.
有机会, 我们考虑更本质的内容吧.
那, 今天到这里吧.
再见!