MySQL的事务(transactions)详解及基本使用
在MySQL中,默认的存储引擎是InnoDB,InnoDB支持事务,而MyISAM不支持事务。
1. 什么是事务
MySQL事务是用于管理和维护数据一致性的一组SQL操作。事务确保了数据库中的一系列操作要么全部执行成功,要么全部回滚,从而保证数据的完整性。
事务分为显式事务和隐式事务
显式事务:代码中明确使用事务管理语句来控制事务的开始和结束。
隐式事务:指在单个SQL语句中自动处理的事务。在MySQL中,某些SQL语句(如 INSERT, UPDATE, DELETE 等)如果在未显式开启事务的情况下执行,则MySQL会自动将每个语句当作一个单独的事务来处理。这种方式无需显式地使用事务管理语句,数据库会自动在每个SQL语句执行后立即提交事务。
2. 事务的特性
- 原子性(Atomicity):事务是不可分割的最小操作单元,要么全部成功,要么全部失败。
- 一致性(Consistency):事务完成时,必须使所有的数据都保持一致状态。
- 隔离性(Isolation):数据库系统提供的隔离机制,保证事务在不受外部并发操作影响的独立环境下运行。
- 持久性(Durability):事务一旦提交或回滚,它对数据库中的数据的改变就是永久的。
3. 并发事务带来的问题
- 脏读:一个事务读取到另一个事务还没有提交的数据。
- 不可重复读:一个事务先后读取同一条记录,但两次读取的数据不同,称为不可重复读。
- 幻读:一个事务按照条件查询数据时,没有对应的数据行,但是在插入数据时,又发现了这行数据已经存在,好像出现了“幻影”。
4. 事务的隔离级别
MySQL提供了4种事务隔离级别
- 读已提交(READ UNCOMMITTED):最低的隔离级别,事务可以读取其他未提交事务的数据,可能会出现脏读(dirty read)。
- 读已提交(READ COMMITTED):事务只能读取其他已提交的事务的数据,避免脏读,但可能会出现不可重复读(non-repeatable read)。
- 可重复读(REPEATABLE READ):默认的隔离级别,事务再开始时只能看到已提交的数据,并且在整个事务中看到的数据时一致的,避免了不可重复读,但可能会出现幻读(phantom read)。
- 可串行化(SERIALIZABLE):最高的隔离级别,通过锁定读取的所有数据行,避免了幻读,但是会导致性能下降。
5. MySQL中的事务的使用方法
显式事务的步骤:
- 关闭事务自动提交
-- 关闭自动提交(适用于显式事务)
SET autocommit = 0;
-- 开启自动提交(适用于隐式事务)
SET autocommit = 1;
- 开始事务:使用
START TRANSACTION
或BEGIN
。 - 执行SQL操作:执行一个或多个SQL语句。
- 提交事务:如果所有操作成功,则使用
COMMIT
语句提交事务。 - 回滚事务:如果遇到错误或需要撤销操作,则使用
ROLLBACK
语句回滚事务。
5.1 开启事务(显式事务)
START TRANSACTION;
或
BEGIN;
5.2 提交事务
提交事务使用COMMIT语句,所有的修改将被保存到数据库中
COMMIT;
5.3 回滚事务
回滚事务使用ROLLBACK
语句,所有的修改将被撤销。
ROLLBACK;
5.4 设置事务的隔离级别
SET TRANSACTION ISOLATION LEVEL 隔离级别;
例如,设置为读已提交:
SET TRANSACTION ISOLATION LEVEL READ COMMITTED;