Mariadb InnoDB存儲引擎和事務

Mariadb存儲引擎:   數據庫

    Mariadb中的數據用各類不一樣的技術存儲在文件(或者內存)中。這些技術中的每一種技術都使用不一樣的存儲機制、索引技巧、鎖定水平而且最終提供普遍的不一樣的功能和能力。經過選擇不一樣的技術,你可以得到額外的速度或者功能,從而改善你的應用的總體功能。安全


顯式請求對錶添加讀鎖(共享鎖)bash

MariaDB [hellodb]> LOCK TABLES students READ;

撤銷對錶的鎖定服務器

MariaDB [hellodb]> UNLOCK TABLES;

顯式請求對錶添加寫鎖(獨佔鎖)併發

MariaDB [hellodb]> LOCK TABLES students WRITE;




  Mariadb的事務支持不是綁定在Mariadb服務器自己,而是與存儲引擎相關1.MyISAM:不支持事務,用於只讀程序提升性能 2.InnoDB:支持ACID事務、行級鎖、併發ide

  一個事務是一個連續的一組數據庫操做,就好像它是一個單一的工做單元進行。換言之,永遠不會是完整的事務,除非該組內的每一個單獨的操做是成功的。若是在事務的任何操做失敗,則整個事務將失敗。性能

啓動事務spa

MariaDB [hellodb]> START TRANSACTION;

回滾事務rest

MariaDB [hellodb]> ROLLBACK;

提交事務索引

MariaDB [hellodb]> COMMIT;


對事務作保存點savepoint,能夠回滾到指定的保存點

MariaDB [hellodb]> START TRANSACTION;
MariaDB [hellodb]> DELETE FROM students WHERE StuID=1;
MariaDB [hellodb]> SAVEPOINT SP1;
MariaDB [hellodb]> INSERT INTO students(Name,Age,Gender) VALUES ('test',19,'M');
MariaDB [hellodb]> SAVEPOINT SP2;
MariaDB [hellodb]> ROLLBACK TO SP2;
#回滾到保存點
MariaDB [hellodb]> RELEASE SAVEPOINT SP1;
#刪除保存點


事務隔離級別:

  READ UNCOMMITTED (讀未提交,能讀別人尚未提交的數據),存在髒讀,不可重複讀,幻讀問題

Mariadb會話一:
MariaDB [hellodb]> SET tx_isolation='READ-UNCOMMITTED';
MariaDB [hellodb]> START TRANSACTION;
MariaDB [hellodb]> UPDATE students SET Age=99 WHERE StuID=26;
MariaDB [hellodb]> ROLLBACK;

Mariadb會話二:
MariaDB [hellodb]> SET tx_isolation='READ-UNCOMMITTED';
MariaDB [hellodb]> START TRANSACTION;
MariaDB [hellodb]> SELECT * FROM students WHERE StuID = 26;
+-------+------+-----+--------+---------+-----------+
| StuID | Name | Age | Gender | ClassID | TeacherID |
+-------+------+-----+--------+---------+-----------+
|    26 | test |  19 | M      |    NULL |      NULL |
+-------+------+-----+--------+---------+-----------+
#啓動事務後會話一不曾修改數據前
MariaDB [hellodb]> SELECT * FROM students WHERE StuID = 26;
+-------+------+-----+--------+---------+-----------+
| StuID | Name | Age | Gender | ClassID | TeacherID |
+-------+------+-----+--------+---------+-----------+
|    26 | test |  99 | M      |    NULL |      NULL |
+-------+------+-----+--------+---------+-----------+
#啓動事務後會話一修改數據後,能夠看到在會話一併無提交事務前,會話二就已經能夠看到數據已經更改,因此READ UNCOMMITTED事務隔離級別存在髒讀問題,不可重複讀,幻讀問題
MariaDB [hellodb]> ROLLBACK;


  READ COMMITTED (讀提交,只有別人提交的數據才能讀取,未提交的數據是看不到的),存在不可重複讀,幻讀問題

會話一:
MariaDB [hellodb]> SET tx_isolation='READ-COMMITTED';
MariaDB [hellodb]> START TRANSACTION;
MariaDB [hellodb]> UPDATE students SET Age=19 WHERE StuID=26;
MariaDB [hellodb]> COMMIT;

會話二:
MariaDB [hellodb]> SET tx_isolation='READ-COMMITTED';
MariaDB [hellodb]> START TRANSACTION;
MariaDB [hellodb]> SELECT * FROM students WHERE StuID = 26;
+-------+------+-----+--------+---------+-----------+
| StuID | Name | Age | Gender | ClassID | TeacherID |
+-------+------+-----+--------+---------+-----------+
|    26 | test |  19 | M      |    NULL |      NULL |
+-------+------+-----+--------+---------+-----------+
#啓動事務後會話一不曾修改數據前
MariaDB [hellodb]> SELECT * FROM students WHERE StuID = 26;
+-------+------+-----+--------+---------+-----------+
| StuID | Name | Age | Gender | ClassID | TeacherID |
+-------+------+-----+--------+---------+-----------+
|    26 | test |  19 | M      |    NULL |      NULL |
+-------+------+-----+--------+---------+-----------+
#能夠看到會話一修改數據後會話二查看並無修改,只有會話一提交事務後才能看到修改,因此READ COMMITTED隔離事務存在不可重複讀,幻讀問題。咱們試試提交會話一看看
MariaDB [hellodb]> SELECT * FROM students WHERE StuID = 26;
+-------+------+-----+--------+---------+-----------+
| StuID | Name | Age | Gender | ClassID | TeacherID |
+-------+------+-----+--------+---------+-----------+
|    26 | test |  99 | M      |    NULL |      NULL |
+-------+------+-----+--------+---------+-----------+


  REPEATABLE READ (可重讀,能夠屢次讀取,屢次讀取的數據不會改變,一邊修改不會影響另外一邊數據,只有另外一邊也提交了纔會更改),存在幻讀問題

#Mariadb默認的級別,這裏不作演示,存在幻讀問題


  SERIALIZABLE (可串行化,一個會話的操做會阻塞另外一個會話),存在加鎖讀問題

會話一:
MariaDB [hellodb]> SET tx_isolation='SERIALIZABLE';
MariaDB [hellodb]> START TRANSACTION;
MariaDB [hellodb]> UPDATE students SET Age=99 WHERE StuID=26;
ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction
#這裏能夠看到,由於會話二作了查詢,一個會話的操做會阻塞另外一個會話的操做。安全級別最高,併發極差


會話二:
MariaDB [hellodb]> SET tx_isolation='SERIALIZABLE';
MariaDB [hellodb]> START TRANSACTION;
MariaDB [hellodb]> SELECT * FROM students WHERE StuID = 26;
+-------+------+-----+--------+---------+-----------+
| StuID | Name | Age | Gender | ClassID | TeacherID |
+-------+------+-----+--------+---------+-----------+
|    26 | test |  19 | M      |    NULL |      NULL |
+-------+------+-----+--------+---------+-----------+


可能存在問題:

  髒讀,讀別人尚未提交的數據;

  不可重複讀,兩次讀取的數據不一致;

  幻讀,當對方不提交時數據一致,當對方提交後數據不一致,致使不知道那個數據爲真實數據;

  加鎖讀;

MariaDB [hellodb]> SHOW GLOBAL VARIABLES LIKE 'tx_isolation';
MariaDB [hellodb]>  SET tx_isolation='READ-UNCOMMITTED';
#默認級別爲REPEATABLE-READ
相關文章
相關標籤/搜索