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的double write和Oracle對比學習MySqlOracle
- Mysql之事務MySql
- MySQL之事務和redo日誌MySql
- MySQL入門學習之——mysql與oracle死鎖對比MySqlOracle
- MySQL和Oracle對比學習之資料字典後設資料MySqlOracle
- MySQL之事務隔離級別和MVCCMySqlMVC
- 與MSSQL對比學習MYSQL的心得MySql
- MySQL和Oracle中的delete,truncate對比MySqlOracledelete
- JS學習之事件和事件繫結JS事件
- MySQL面試必備三之事務MySql面試
- Oracle和MySQL的高可用方案對比(一)OracleMySql
- Oracle和MySQL的高可用方案對比(二)OracleMySql
- MySQL和Oracle對比之儲存過程MySqlOracle儲存過程
- 對比學習Vue和微信小程式Vue微信小程式
- Spring學習之事務的使用姿勢一覽Spring
- Oracle和MySQL資料庫CTAS等操作對比OracleMySql資料庫
- MYSQL多表更新刪除以及和ORACLE的對比MySqlOracle
- 初步學習jQuery之事件jQuery事件
- Spring5.0原始碼學習系列之事務管理概述Spring原始碼
- Java NIO學習系列四:NIO和IO對比Java
- perl DBI DBD和java 的JDBC對比學習JavaJDBC
- TIDB和MySQL效能對比TiDBMySql
- Blazor和Vue對比學習(基礎1.4):事件和子傳父BlazorVue事件
- 對比學習 ——simsiam 程式碼解析。
- 學習Oracle和MySQL推薦的幾本書OracleMySql
- Java進階學習之事件響應Java事件
- Vue學習筆記之事件處理Vue筆記事件
- Redis 原始碼學習之事件驅動Redis原始碼事件
- 簡單對比MySQL和Oracle中的一個sql解析細節MySqlOracle
- Oracle 和 mysql 的一些簡單命令對比參照(轉)OracleMySql
- Mysql學習總結(50)——Oracle,mysql和SQL Server的區別MySqlOracleServer
- MySQL 事務的學習整理MySql
- PostgreSQL和oracle表分割槽對比SQLOracle
- SQLServer和Oracle常用函式對比SQLServerOracle函式
- MySQL和MongoDB設計例項對比MySqlMongoDB
- 好程式設計師Java學習進階之MySQL資料庫結構和引擎比對程式設計師JavaMySql資料庫
- Blazor和Vue對比學習(基礎1.3):屬性和父子傳值BlazorVue