MySQL和Oracle對比學習之事務
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)
所以這個案例帶給我們的啟示就是很多細節只是需要自己嘗試去實驗,不要想當然;很多思想也不能想當然,可能在這個地方可用,在別的地方就不一定可用,這些細節不能忽視。
因為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)
所以這個案例帶給我們的啟示就是很多細節只是需要自己嘗試去實驗,不要想當然;很多思想也不能想當然,可能在這個地方可用,在別的地方就不一定可用,這些細節不能忽視。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/23718752/viewspace-1570765/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- MySQL學習之事務隔離MySql
- Mysql之事務MySql
- MySQL之事務和redo日誌MySql
- MySQL之事務隔離級別和MVCCMySqlMVC
- Oracle和MySQL資料庫CTAS等操作對比OracleMySql資料庫
- 與MSSQL對比學習MYSQL的心得MySql
- JS學習之事件和事件繫結JS事件
- oracle Mysql PostgreSQL 資料庫的對比OracleMySql資料庫
- Contrastive Learning 對比學習 | RL 學 representation 時的對比學習AST
- Spring學習之事務的使用姿勢一覽Spring
- TIDB和MySQL效能對比TiDBMySql
- MySQL面試必備三之事務MySql面試
- 對比學習Vue和微信小程式Vue微信小程式
- Spring5.0原始碼學習系列之事務管理概述Spring原始碼
- 初步學習jQuery之事件jQuery事件
- mysql和oracle計劃任務MySqlOracle
- Java NIO學習系列四:NIO和IO對比Java
- oracle partition by group by,詳解partition by和group by對比Oracle
- Blazor和Vue對比學習(基礎1.4):事件和子傳父BlazorVue事件
- Vue 學習 Ref shallowRef triggerRef customRef (Ref 和 Reactive的對比)VueReact
- Oracle、MySQL常見表結構變更語句對比OracleMySql
- 好程式設計師Java學習進階之MySQL資料庫結構和引擎比對程式設計師JavaMySql資料庫
- 對比學習 ——simsiam 程式碼解析。
- Oracle、NoSQL和NewSQL 資料庫技術對比OracleSQL資料庫
- Blazor和Vue對比學習(基礎1.3):屬性和父子傳值BlazorVue
- Vue學習筆記之事件處理Vue筆記事件
- Java進階學習之事件響應Java事件
- 論 MySQL 之事務隔離級別 | 資料庫篇MySql資料庫
- Blazor和Vue對比學習(基礎1.5):雙向繫結BlazorVue
- TSPython操作MySQL MongoDB Oracle三大資料庫深入對比oeePythonMySqlMongoDBOracle大資料資料庫
- redis學習(九) redis事務和redis指令碼的比較Redis指令碼
- 對比學習:Golang VS Python3GolangPython
- Oracle、NoSQL和NewSQL 資料庫技術對比(一)OracleSQL資料庫
- MySQL 資料對比MySql
- Blazor和Vue對比學習(基礎1.2):模板語法和Razor語法BlazorVue
- Blazor和Vue對比學習(進階2.1.1):生命週期,基本理解和使用BlazorVue
- 學習筆記之事件迴圈-Event loop筆記事件OOP
- C#學習筆記(與Java、C、C++和Python對比)C#筆記JavaC++Python
- 科大訊飛學習機t20和P30對比