事务(Transaction)是数据库管理系统(DBMS)中的一个重要概念,它是一系列操作的集合,这些操作要么全部执行成功,要么全部失败。事务是数据库的基本操作单元,它是数据库系统中的一个逻辑单位,用于保证数据的一致性、隔离性和持久性。
在MySQL中,事务具有以下四个特性,通常称为ACID特性:
1.原子性(Atomicity):事务中的所有操作要么全部执行成功,要么全部失败。原子性保证了事务的不可分割性,即事务中的操作是一个整体,不能被分割或拆分。2.一致性(Consistency):事务执行前后,数据库的状态应该保持一致。一致性保证了事务的执行不会破坏数据库的完整性约束和业务规则。3.隔离性(Isolation):事务之间应该相互隔离,一个事务不应该受到其他事务的干扰。隔离性保证了事务的执行不会受到其他并发事务的影响,从而确保数据的正确性。4.持久性(Durability):事务一旦提交,其对数据库的所有修改都应该是永久性的。持久性保证了事务的执行结果能够被持久化存储,即使在系统故障的情况下,事务的执行结果也不会丢失。
在MySQL中,可以使用以下命令来控制事务:
?START TRANSACTION;
or BEGIN;
:开始一个新的事务。?COMMIT;
:提交当前事务,使事务中的所有修改生效。?ROLLBACK;
:回滚当前事务,撤销事务中的所有修改。
事务并发是指多个事务同时执行,这可能会导致以下问题:
1.丢失更新:当两个或多个事务同时对相同的数据进行更新时,最后提交的事务可能会覆盖之前提交的事务所做的修改,导致之前的更新丢失。1.解决办法:乐观锁+版本号2.脏读:当一个事务读取了另一个事物尚未提交的数据时,如果该事务最终回滚,则读取到的数据就是无效的,这种现象被称为脏读。3.不可重复读:当一个事务在读取同一行数据时,由于其它事务的更新操作导致多次读取到的数据不一致,即同一行数据在前后两次读取之间发生了变化。4.幻读:当一个事务在读取某个范围内的数据时,另一个事务在该范围内插入了新的数据或删除了已有数据,导致第一个事务在后续读取时发现多出或缺少了数据行,出现幻读现象。
为了解决事务并发带来的问题,数据库系统提供了事务隔离级别(Transaction Isolation Level)的概念。事务隔离级别定义了一个事务与其他事务之间的隔离程度,以防止并发事务带来的问题。MySQL支持以下四种事务隔离级别:
1.未提交读(Read Uncommitted):允许一个事务读取另一个事务未提交的数据。这可能导致脏读、不可重复读、幻读。2.已提交读(Read Committed):只允许一个事务读取另一个事务已经提交的数据。这可以防止脏读问题,当仍然坑出现不可重复读和幻读问题。3.可重复读(Repeatable Read):在同一个事务中多次读取同一数据时,保证读取到的数据时一致的。这可以防止脏读和不重复读问题,但仍会出现幻读问题。4.串行化(Serializable):要求所有的事务串行执行,即一个事务在执行时,其它事务必须等待。这可以防止脏读、不可重复读和幻读问题,但会降低并发性能。
隔离级别 | 脏读 | 不可重复读 | 幻读 |
---|---|---|---|
未提交读(Read Uncommitted) | 是 | 是 | 是 |
已提交读(Read Committed) | 否 | 是 | 是 |
可重复读(Repeatable Read) | 否 | 否 | 是 |
串行化(Serializable) | 否 | 否 | 否 |
-- 查看事务隔离级别
-- 使用系统变量查询
SELECT @@transaction_isolation;
-- 5.7.20之前
SHOW VARIABLES LIKE '_isolation';
-- 5.7.20之后版本
SHOW VARIABLES LIKE 'transaction_isolation';
-- 设置事务隔离级别
SET [GLOBAL | SESSION] TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
声明:本作品采用署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0)[1]进行许可,使用时请注明出处。 Author: mengbin[2] blog: mengbin[3] Github: mengbin92[4] cnblogs: 恋水无意[5] 腾讯云开发者社区:孟斯特[6]
[1]
署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0): https://creativecommons.org/licenses/by-nc-sa/4.0/deed.zh
[2]
mengbin: mengbin1992@outlook.com
[3]
mengbin: https://mengbin.top
[4]
mengbin92: https://mengbin92.github.io/
[5]
恋水无意: https://www.cnblogs.com/lianshuiwuyi/
[6]
孟斯特: /developer/user/6649301