共计 3058 个字符,预计需要花费 8 分钟才能阅读完成。
这篇文章主要介绍“MYSQL 事务以及隔离级的概念”,在日常操作中,相信很多人在 MYSQL 事务以及隔离级的概念问题上存在疑惑,丸趣 TV 小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”MYSQL 事务以及隔离级的概念”的疑惑有所帮助!接下来,请跟着丸趣 TV 小编一起来学习吧!
事务的概念
事务是一组原子性的 SQL 查询语句,也可以被看做一个工作单元。如果数据库引擎能够成功地对数据库应用所有的查询语 句,它就会执行所有查询,如果任何一条查询语句因为崩溃或其他原因而无法执行,那么所有的语句就都不会执行。也就是说,事务内的语句要么全部执行,要么一 句也不执行。
例:将 b 表中符合条件的记录搬移到 a 表中 (相似语句已在命令提示行中测试)
双击代码全选
5start 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 系统级别的事务隔离级别:
双击代码全选
1mysql SELECT @@global.tx_isolation;
查看 InnoDB 会话级别的事务隔离级别:
双击代码全选
1mysql SELECT @@tx_isolation;
MySQL 中的事务
AUTOCOMMIT(自动提交)
MySQL 默认操作模式是 AUTOCOMMIT 模式。这意味着除非显示地开始一个事务,否则它将把每个查询视为一个单独事务自动执行。在当前连接中,可以通过变量设置,启用和禁用 AUTOCOMMIT 模式。
双击代码全选
2mysql 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 事务以及隔离级的概念”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注丸趣 TV 网站,丸趣 TV 小编会继续努力为大家带来更多实用的文章!