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
相关文章
相关标签/搜索