您好,登录后才能下订单哦!
这篇文章主要介绍“MYSQL事务以及隔离级的概念”,在日常操作中,相信很多人在MYSQL事务以及隔离级的概念问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”MYSQL事务以及隔离级的概念”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!
事务的概念
事务是一组原子性的SQL查询语句,也可以被看做一个工作单元。如果数据库引擎能够成功地对数据库应用所有的查询语 句,它就会执行所有查询,如果任何一条查询语句因为崩溃或其他原因而无法执行,那么所有的语句就都不会执行。也就是说,事务内的语句要么全部执行,要么一 句也不执行。
例:将b表中符合条件的记录搬移到a表中(相似语句已在命令提示行中测试)
1 2 3 4 5 | start transaction ;//用start transaction 语句开始一个事务 insert into a select from b where ...;//将b表中符合条件的行记录插入a表 delete from b where ...;//将b表中符合条件的行记录删除 commit ; / rollback ; // commit 语句提交整个事务,永久地修改数据, rollback 语句回滚整个事务,取消已做的修改 //如果插入操作失败,那么删除操作将不执行 |
ACID测试
ACID:原子性(atomicity)、一致性(consistency)、隔离性(isolation)、持久性(durability)。一个有效的事务处理系统必须满足相关标准。
a.原子性:一个事务必须被视为一个单独的内部“不可分”的工作单元,以确保整个事务要么全部执行,要么全部回滚。当一个事务具有原子性时,该事务绝对不会被部分执行,要么完全执行,要么根本不执行。
b.一致性:数据库总是从一种一致性状态转换到另一种一致性状态。在上述例子中,一致性确保了,即使插入或者删除操作失败了,数据库也不会多出或者丢失记录。因为最终事务根本没有被提交,任何事务处理过程中所做的数据改变,也不会影响到数据库的内容。
c.隔离性:某个事务的结果只有在完成之后才对其他事务可见。在上述例子中,当数据库执行完insert语句,还未执行delete语句时,如果此时另一个客户端对数据库的访问也同时运行,它将仍视符合条件的记录在b表中。
d.持久性:一旦一个事务提交,事务所做的数据改变将是永久的。
这种事务处理中的额外安全措施,导致数据库服务器要完成更多的额外工作。通常,一个支持ACID特性的数据库,相对于不支持这种特性的数据库,需要更强 的CPU处理能力,更大的内存和更多的磁盘空间。这正是选用MYSQL存储引擎架构的有利之处。用户可以根据应用是否需要事务处理,选择相应的存储引擎。 如果对于某些类型的数据查询,用户不需要真正的事务处理,他可以选择一个非事务处理型的存储引擎来实现查询,以获得更高的处理性能。(我们的数据库选择的 存储引擎是innoDB,支持事务处理,而mysql默认的存储引擎是MyISAM引擎,不支持事务)
隔离级
SQL标准定义了4类隔离级,包括了一些具体规则,用来限定事务内外的哪些改变时可见的,哪些是不可见的。低级别的隔离级一般支持更高的并发处理,并拥有更低的系统开销。
READ UNCOMMITTED(读取未提交内容)
在READ UNCOMMITTED隔离级,所有事务都可以“看到”未提交事务的执行结果。在这种级别上,可能会产生很多问题。本隔离级很少用于实际应用,因为它的性 能也不比其他级别好多少,而别的级别还有其他更多的优点。读取未提交数据,也被称之为“脏读(Dirty Read)”
READ COMMITTED(读取提交内容)
大多数数据库系统的默认隔离级是READ COMMITTED(但这不是MYSQL默认的)。它满足了隔离的早先简单定义:一个事务在开始时,只能“看见”已经提交事务所做的改变,一个事务从开始 到提交前,所做的任何数据改变都是不可见的,除非已经提交。这种隔离级别也支持所谓的“不可重复读(Nonrepeatable Read)”。这意味着用户运行同一语句两次,看到的结果是不同的。
REPEATABLE READ(可重读)
REPEATABLE READ 隔离级解决了READ UNCOMMITTED隔离级导致的问题。它确保同一事务的多个实例在并发读取数据时,会“看到相同的”数据行。不过理论上,这会导致另一个棘手问题:幻 读(Phantom Read)。简单来说,幻读指当用户读取某一范围的数据行时,另一个事务又在该范围内插入了新行,当用户再读取该范围的数据行时,另一个事务又在该范围内 插入了新行,当用户再读取该范围的数据行时,会发现有新的“幻影”行。InnoDB和Falcon存储引擎通过多版本并发控制机制解决了幻读问题。 REPEATABLE READ 是MYSQL的默认事务隔离级。InnoDB和Falcon存储引擎都遵循这种设置。
SERIALIZABLE(可串行化)
SERIALIZABLE是最高级别的隔离级,它通过强制事务排斥,使之不可能相互冲突,从而解决幻读问题。简言之,SERIALIZABLE是在每个读的数据行上加锁。在这个级别,可能导致大量的超时现象和锁竞争现象。很少看到有用户选择这种隔离级。
注:不可重复读与幻读:不可重复读的重点是修改(同样的查询条件,你读取过的数据,再次读取出来发现值不一样了);幻读的重点在于新增或者删除(同样的查询条件,第1次和第2次读出来的记录数不一样)
查看InnoDB系统级别的事务隔离级别:
1 | mysql> SELECT @@ global .tx_isolation; |
查看InnoDB会话级别的事务隔离级别:
1 | mysql> SELECT @@tx_isolation; |
MySQL中的事务
AUTOCOMMIT(自动提交)
MySQL默认操作模式是AUTOCOMMIT模式。这意味着除非显示地开始一个事务,否则它将把每个查询视为一个单独事务自动执行。在当前连接中,可以通过变量设置,启用和禁用AUTOCOMMIT模式。
1 2 | mysql> SHOW VARIABLES LIKE 'AUTOCOMMIT' ; //高版本的mysql支持 mysql> select @@autocommit; //mysql5.0支持 |
如果设置AUTOCOMMIT=0,用户将一直处于某个事务中,直到用户执行一条COMMIT或ROLLBACK语句,之后,MYSQL将立即开始一个新事务。
在事务中混合使用存储引擎
在一个事务中,如果混合使用事务性表和非事务性表,假如事务处理一切顺利,那么结果也会正常。但是,如果事务须回滚,那么在非事务性表上做的修改将无法取消。这将导致数据库处于数据不一致的状态,在这种状态下,很难对数据进行恢复,并且事务会变得悬而未决。
隐式和显式锁定
InnoDB使用二相锁定协议(Two-Phase Locking Protocol两段锁协议)。一个事务在执行过程中的任何时候,都可以获得锁,但只有在执行COMMIT或ROLLBACK语句后,才可以释放这些锁。 它会同时释放掉所有锁。以上描述的锁定机制都是隐式锁定。InnoDB会根据用户的隔离级别,自动处理锁定。不过InnoDB也支持显示锁定。
到此,关于“MYSQL事务以及隔离级的概念”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注亿速云网站,小编会继续努力为大家带来更多实用的文章!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。