【笔记】MySQL事务

一、事务的特性

在事务中的操作,要么都执行修改,要么都不执行,这就是事务的目的,也是事务模型区别于文件系统的重要特征之一。

使用事务可以大大提高数据安全性和执行效率,因为在执行多条SQL命令的过程中不必再使用LOCK命令锁定整个数据表,MySQL目前只支持InnoDB数据上的事务。

1. 原子性 

原子性是指整个数据库事务是不可分割的工作单位 。只有使事务中所有的数据库操作都执行成功,整个事务的执行才算成功。

2. 一致性

一致性是指事务将数据库从一种状态变成另一种一致的的状态。在事务开始之前和事务结束以后,数据库的完整性约束没有被破坏。

3. 隔离性

隔离性要求每个读写事务的对象域其他事务的操作对象能相互分离,即该事务提交前对其他事务都不可见,这通常使用锁来实现。

4.  持久性

事务一旦提交,其结果就是永久性的,即使发生死机等故障,数据库也能将数据恢复。

二、事务的分类

1.  扁平事务

2.  带有保存点的扁平事务

3.  链事务

4.  嵌套事务

5.  分布式事务

三、事务控制语句

1. 开启事务

在MySQL命令行的默认设置下,事务都是自动提交的,即执行SQL语句后会马上执行 COMMIT 操作。因此要显式地开启一个事务必须使用 START TRANSACTION 或 BEGIN WORK 语句,或者执行 SET AUTOCOMMIT=0 语句,以禁用当前会话的自动提交。

START TRANSACTION 的作用相当于 SQL Sever 数据库中的 BEGIN TRANSACTION 语句。该语句是本地事务的起始点,用于开始事务

2. 提交事务

如果要使用提交事务语句的最简单形式,只需发出 COMMIT 命令。COMMIT 更详细的写法是 COMMIT WORK, 这两者几乎是等价的。不同之处在于 COMMIT WORK用来控制事务结束后的行为是 CHAIN 还是 RELEASE。如果是 CHAIN 方式,那么事务就变成了链事务。用户可以通过参数 completion_type 来进行控制,参数的取值说明如下。

    (1) 如果 completion 参数值为0(默认值),表示没有任何操作。在这种设置下,COMMIT 和 COMMIT WORK 是完全等价的。

    (2) 如果 completion_type 参数值为1, COMMIT WORK 等同于 COMMIT AND CHAIN, 表示马上自动开启一个相同的隔离级别的事务。

    (3) 如果 completion_type 参数值为2, COMMIT WORK 等同于 COMMIT AND RELEASE,当事务提交后会自动断开与服务器的连接。

3. 回滚事务

ROLLBACK,回滚会结束用户的事务,并撤销正在进行的所有未提交的修改。 (ROLLACK WORK)

4. 其他语句

    (1)SAVEOINT identifier。SAVEOINT 允许在事务中创建一个保存点,一个事务中可以有多个SAVEOPINT。

    (2)RELEASE SAVEOINT identitier。删除一个事务的保存点,当没有一个保存点执行 RELEASE SAVEOPINT identitier 语句时,会抛出一个异常。

    (3)ROLLBACK TO [SAVEPOINT] identitier。ROLLBACK TO [SAVEPOINT] identitier 语句与 SAVEOPINT 一起使用,可以把事务回滚到标记点,而不回滚在此标记点之前的任何工作。但是,如果回滚到一个不存在的保存点,会抛出异常。

    (4)SET TRANSACTION。SET TRANSACTION 语句用来设置事务的隔离级别。

5. 隐式提交的 SQL 语句

    (1) 数据定义语言

数据定义语言(DDL)是 SQL 集中负责数据结构定义与数据对象定义的语言,由 CREATE 、ALTER和DROP三个语句组成。

    (2) 隐式修改MySQL架构的操作语句

CREATE USER、DROP USER、GRANT、RENAME USER、REVOKE和SET PASSWORD。

    (3) 管理语句

ANALYZE TABLE、CACHE INDEX、LOAD INDEX INTO CACHE、OPTIMIZE TABLE和REPAIR TABLE。

四、事务的隔离级别

1. READ UNCOMMITTED

设置 READ UNCOMMITTED (读取未提交内容)隔离级别,所有事务都可以看到其他未提交事务的执行结果。 READ UNCOMMITTED 隔离级别很少用于实际应用,因为它的性能也不比其他级别好多少。读取未提交的数据,也被成为脏读(Dirty Read)。

2. READ COMITTED

READ COMITTED 是大多数数据库系统的默认隔离级别(但不是 MySQL 默认的)。它满足了隔离的简单定义:一个事务只能看见已经提交事务所做的改变。这种隔离级别也支持所谓的不可重复读(NONREPEATABLE READ),因为同一事务的其他实例在该实例处理期间可能会有新的 COMMIT, 所以同一查询可能返回不同结果。

3. REPEATABLE READ

REPEATABLE READ (可重复读) 是MySQL的默认事务隔离级别,它确保同一事务的多个实例在并发读取事务数据时,会看到同样的数据行。

4. SERIALZABLE

SERIALZABLE 是最高的隔离级别,它通过强制事务排序,使之不可能相互冲突,从而解决幻读问题。简单来说,它是在每个读的数据行上加上共享锁。在这个级别中,可能导致大量的超时现象和锁竞争。

5. 隔离级别发生的问题

实现4类隔离级别可能产生的问题
隔离级别脏读可能性不可重复读可能性幻读可能性加锁读
READ UNCOMMITTED
READ COMITTED
REPEATABLE READ
SERIALZABLE

 

 

 

 

 

 

### 关于 MySQL 和 Spring 事务管理的核心概念 在实际开发中,操作数据库时会涉及事务管理问题。为此,Spring 提供了专门用于事务处理的 API,简化了传统事务管理流程并减少开发者工作量[^1]。 #### 编程式与声明式事务管理 在 Spring 中进行事务管理有两类主要方式:编程式事务管理和声明式事务管理。其中,声明式事务管理是最常用的方案[^2]。它通过 `@Transactional` 注解来实现,能够显著降低代码复杂度,并使事务逻辑与业务逻辑分离。 #### 事务属性详解 当使用 `@Transactional` 注解时,需注意两个重要方面——事务传播行为(propagation)和隔离级别(isolation)。这些配置直接影响到系统的性能以及数据的一致性[^3]: - **事务传播行为**定义了一个方法如何参与现有事务或者创建新事务。常见的传播行为包括: - `REQUIRED`: 如果当前存在事务,则加入该事务;如果不存在则新建一个事务。 - `REQUIRES_NEW`: 创建一个新的事务,无论当前是否存在事务。 - **事务隔离级别**控制多个并发事务之间的可见性和干扰程度。标准的隔离级别如下: - `READ_UNCOMMITTED`: 允许读取未提交的数据变更。 - `READ_COMMITTED`: 只允许读取已提交的数据。 - `REPEATABLE_READ`: 确保同一事务中的多次读取结果相同。 - `SERIALIZABLE`: 最高隔离级别,完全防止脏读、不可重复读和幻读。 以下是基于上述理论的一个简单示例程序,展示如何利用 `@Transactional` 配置不同的传播行为和隔离级别: ```java @Service public class TransactionService { @Autowired private UserRepository userRepository; @Transactional(propagation = Propagation.REQUIRED, isolation = Isolation.READ_COMMITTED) public void addUserWithTransaction(User user) { // 执行保存用户的逻辑 userRepository.save(user); // 假设此处抛出异常以测试回滚机制 if (user.getName().equals("error")) { throw new RuntimeException("模拟错误"); } } } ``` 此代码片段展示了如何设置事务的传播行为为 `REQUIRED` 并指定隔离级别为 `READ_COMMITTED`。这有助于确保即使在多线程环境下也能维持良好的数据一致性。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值