Mariadb存储引擎:
Mariadb中的数据用各种不同的技术存储在文件(或者内存)中。这些技术中的每一种技术都使用不同的存储机制、索引技巧、锁定水平并且最终提供广泛的不同的功能和能力。通过选择不同的技术,你能够获得额外的速度或者功能,从而改善你的应用的整体功能。
显式请求对表添加读锁(共享锁)
MariaDB [hellodb]> LOCK TABLES students READ;
撤销对表的锁定
MariaDB [hellodb]> UNLOCK TABLES;
显式请求对表添加写锁(独占锁)
MariaDB [hellodb]> LOCK TABLES students WRITE;
Mariadb的事务支持不是绑定在Mariadb服务器本身,而是与存储引擎相关1.MyISAM:不支持事务,用于只读程序提高性能 2.InnoDB:支持ACID事务、行级锁、并发
一个事务是一个连续的一组数据库操作,就好像它是一个单一的工作单元进行。换言之,永远不会是完整的事务,除非该组内的每个单独的操作是成功的。如果在事务的任何操作失败,则整个事务将失败。
启动事务
MariaDB [hellodb]> START TRANSACTION;
回滚事务
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
转载于:https://blog.51cto.com/kgdbfmwfn/1708678