MySQL和Oracle對比學習之事務(r5筆記第4天)
MySQL中的儲存引擎很是豐富,常用的有InnoDB,MyISAM等,也查看了不少的資料,基本也有所瞭解,從一些參考書中看MySQL中的sql部分也是一掃而過,感覺和Oracle中的sql部分沒有大的區別。 因為InnoDB和MyISAM儲存引擎的一個主要區別就是對於事務的支援,所以自己也複製了oracle中的想法。 簡單做了兩個測試,只是想練手試一下,結果測試讓我很意外。 我建立了兩個表myisam_test和innodb_test,做一個insert操作,然後rollback,按照預期的想法,因為Myisam不支援事務,所以insert操作做rollback是不會回退的,對於innodb應該可以。
mysql> create table myisam_test(id int) engine=myisam; Query OK, 0 rows affected (0.01 sec) mysql> insert into myisam_test values(1); Query OK, 1 row affected (0.00 sec) mysql> select *from myisam_test; +------+ | id | +------+ | 1 | +------+ 1 row in set (0.00 sec) mysql> rollback; Query OK, 0 rows affected (0.01 sec) mysql> select *from myisam_test; --這個結果也是預料之中的。 +------+ | id | +------+ | 1 | +------+ 1 row in set (0.00 sec)
再來試試InnoDB的部分,結果讓我很意外。感覺自己的認知都出現了問題。
mysql> create table innodb_test(id int) engine=innodb; Query OK, 0 rows affected (0.03 sec) mysql> insert into innodb_test values(1); Query OK, 1 row affected (0.01 sec) mysql> select *from innodb_test; +------+ | id | +------+ | 1 | +------+ 1 row in set (0.00 sec) mysql> rollback; Query OK, 0 rows affected (0.00 sec) mysql> select *from innodb_test; +------+ | id | +------+ | 1 | +------+ 1 row in set (0.00 sec)
相比於在oracle中,因為沒有這些儲存引擎,測試結果就取一個表ora_test吧。
SQL> create table ora_test(id number);
Table created.
SQL> insert into ora_test values(1);
1 row created.
SQL> select *from ora_test;
ID
----------
1
SQL> rollback;
Rollback complete.
SQL> select *from ora_test;
no rows selected
完全不同的結果,自己琢磨了下,Oracle中是隱式開啟事務,對於一個session中的dml語句,就會自動開啟事務,加入一把TX鎖。
而在MySQL中卻是需要使用start transaction來顯示宣告的。
其實在Oracle中也可以顯示宣告事務,可以使用savepoint來做。這一點上和MySQL是很類似的。
同是對於事務的提交方式上兩者都是開放的,可以靈活的選擇,在oracle中可以通過sqlplus或者驅動連線的設定。
SQL> set autocommit off;
SQL> show autocommit
autocommit OFF
在MySQL中式通過autocommit為1或者0來代表的。1代表自動提交,0表示禁用自動提交。
mysql> set autocommit=0;
Query OK, 0 rows affected (0.00 sec)
所以這個案例帶給我們的啟示就是很多細節只是需要自己嘗試去實驗,不要想當然;很多思想也不能想當然,可能在這個地方可用,在別的地方就不一定可用,這些細節不能忽視。