重启程序猿之《MySQL进阶-事务篇》

MySQL进阶-事务篇

一、事务简介
在 MySQL 中,事务是一组数据库操作的集合,这些操作要么全部成功执行,要么全部不执行,以确保数据库的一致性和完整性。事务具有四个重要特性,即 ACID 特性:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)和持久性(Durability)。
(一)ACID 特性详解
原子性:事务是一个不可分割的工作单元,其中的所有操作要么全部成功完成,要么全部回滚,就像一个完整的操作一样。例如,在银行转账系统中,从一个账户扣款并将款项存入另一个账户这两个操作必须同时成功或同时失败,不能出现扣款成功但存款失败的情况。
一致性:事务执行前后,数据库必须保持一致状态,即满足所有的完整性约束条件。例如,在库存管理系统中,当有商品销售时,库存数量的减少和销售记录的增加必须同时进行,并且库存数量不能为负数。
隔离性:多个事务并发执行时,它们之间相互隔离,互不干扰。每个事务都感觉不到其他事务的存在,就好像是顺序执行一样。不同的隔离级别可以控制事务之间的可见性和相互影响的程度。
持久性:一旦事务提交成功,其对数据库所做的修改将永久保存,即使系统出现故障(如断电、软件崩溃等),数据也不会丢失。
(二)事务操作语句
开启事务:使用START TRANSACTION语句开启一个事务。
示例:START TRANSACTION;
提交事务:使用COMMIT语句提交事务,使事务中的修改永久生效。
示例:INSERT INTO table_name (column1, column2) VALUES (value1, value2); COMMIT;
回滚事务:使用ROLLBACK语句回滚事务,撤销事务中的所有操作。
示例:START TRANSACTION; UPDATE table_name SET column1 = new_value WHERE condition; – 假设出现错误 ROLLBACK;
二、事务隔离级别
MySQL 提供了四种事务隔离级别,用于控制事务之间的隔离程度和并发性能。
(一)读未提交(Read Uncommitted)
特性:一个事务可以读取到另一个未提交事务的数据,可能导致脏读问题。
案例:
假设有两个事务 A 和 B,事务 A 查询一个账户余额,事务 B 更新该账户余额但未提交。在这个隔离级别下,事务 A 可能读取到事务 B 未提交的更新后的数据,如果事务 B 最终回滚,事务 A 读取的数据就是无效的,导致脏读。
(二)读已提交(Read Committed)
特性:避免了脏读,但可能导致不可重复读问题。一个事务只能读取到已经提交的其他事务的数据。
案例:
事务 A 在两次读取同一账户余额的过程中,事务 B 对该余额进行了修改并提交。在这个隔离级别下,事务 A 第二次读取的结果与第一次不同,出现不可重复读现象。
(三)可重复读(Repeatable Read)
特性:MySQL 默认的隔离级别。一个事务在执行期间多次读取同一数据时,会得到相同的结果,但可能出现幻读问题。
案例:
事务 A 按照某个条件查询账户余额,事务 B 更新该条件下的某些账户余额并插入新的账户记录。在这个隔离级别下,事务 A 多次查询余额结果相同,但如果按照新的条件查询,可能会发现多了新的记录,即幻读。
(四)串行化(Serializable)
特性:最高的隔离级别,事务是串行执行的,完全避免了脏读、不可重复读和幻读问题,但并发性能极差。
案例:
事务 A 查询商品库存,事务 B 想要更新商品库存,在这个隔离级别下,事务 B 会被阻塞,直到事务 A 提交或回滚。
三、总结
MySQL 事务通过其 ACID 特性和不同的隔离级别,为数据库的一致性、完整性和并发控制提供了强大的支持。在实际应用中,需要根据具体的业务需求和性能要求选择合适的隔离级别,以确保数据的正确性和系统的性能。同时,正确使用事务操作语句,可以有效地管理数据库的事务,保证数据的可靠性和稳定性。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值