一文带你了解 MySQL 中的事务
什么是事务?
事务是指作为单个逻辑工作单元执行的一系列操作。这些操作必须全部执行或者全部不执行,如果其中有任何一个操作失败,则整个事务都必须回滚到起始状态。
MySQL 中的事务
MySQL 中的事务是通过 commit
和 rollback
语句进行控制的。commit
语句用于提交事务,将进行的所有更改保存到数据库中,rollback
语句用于撤销事务,将进行的所有更改取消。
MySQL 中的事务隔离级别
MySQL 中有四个事务隔离级别,分别是:读未提交,读已提交,可重复读和串行化。
读未提交
在该隔离级别下,事务可以读取其他未提交事务所做的修改。当两个事务同时操作同一个数据时,可能会出现脏读、不可重复读和幻读的问题。
读已提交
在该隔离级别下,一个事务只能读取其他已提交事务所做的修改。该隔离级别可以避免脏读,但不能避免不可重复读和幻读。
可重复读
在该隔离级别下,一个事务可以多次读取相同的数据,并且保证在同一个事务中,读取的结果始终是一致的。该隔离级别可以避免脏读和不可重复读,但不能避免幻读。
串行化
在该隔离级别下,所有事务串行执行,就像访问一个单独的数据库一样,这样就可以避免脏读、不可重复读和幻读。
实例说明
以下是两个示例说明,让我们更好地了解事务的使用。
示例一:回滚事务
START TRANSACTION;
UPDATE users SET balance = balance - 100 WHERE id = 1;
UPDATE users SET balance = balance + 100 WHERE id = 2;
-- 如果 update users 表中的第二个记录不存在,则第一个 SQL 语句将锁定行,而第二个语句不会得到执行并且会回滚事务。
COMMIT;
以上代码表示转账操作,将用户 1 的账户余额减少 100,用户 2 的账户余额增加 100。如果第二个 SQL 语句执行失败,则第一个 SQL 语句不会回滚,而第二个 SQL 语句会回滚,整个事务也会回滚。
示例二:使用事务隔离级别
SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED; -- 设置事务隔离级别
START TRANSACTION;
SELECT * FROM orders WHERE date = '2022-01-01' AND status = 'PENDING' FOR UPDATE;
-- SELECT 记录, 修改其状态
COMMIT;
以上代码表示锁定 orders
表中所有日期为 '2022-01-01' 并且状态为 'PENDING' 的记录进行修改,并将事务隔离级别设置为 READ COMMITTED
。
总结
事务是 MySQL 等数据库系统中非常重要的功能。除了了解事务基础概念外,熟练掌握 MySQL 中的四个事务隔离级别,对于保证交易数据的完整性和一致性也非常重要。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:一文带你了解MySQL中的事务 - Python技术站