MySQL数据库中的事务是一种用来保证一系列操作要么全部成功,要么全部取消的机制。想象一下你去超市购物,拿了很多商品,如果中途发现没带钱包,你可以放弃这次购买,所有商品会回到原位。通过事务,可以确保数据在各种情况下都保持一致和安全。本文将详细介绍MySQL事务的基本概念及其在实际应用中的重要性。理解和正确设置事务的隔离级别对数据库应用程序的性能和数据一致性至关重要。选择适合的隔离级别,既要确保数据的可靠性,又要保持系统的高效运行。
目录
一、什么是事务,为什么需要事务
二、事务四大特性(ACID)
三、隔离级别
四、事务的使用
五、隔离级别
六、设置隔离级别
一、什么是事务,为什么需要事务
事务就是多条sql语句,要么这多条语句都执行,要么都不执行。任何一个步骤执行失败都会回滚所有步骤。
例:银行转账
1.要查看支票账户的余额是否高于转账金额
2.从支票账户余额减去转账金额
3.在储蓄账户余额加上转账金额
这三个步骤就是一个事务,任何一个执行失败就要回滚所有步骤。
二、事务四大特性(ACID)
MySQL中的事务(Transaction)是一组操作的集合,这些操作要么全部成功,要么全部失败,是数据库操作的一个基本单位。事务具有四个关键特性,通常被称为ACID特性:
原子性(Atomicity):事务中的所有操作要么全部完成,要么全部不完成,不会停留在中间状态。如果事务在执行过程中发生错误,所有已经执行的操作都必须撤销,数据库回到事务开始时的状态。
一致性(Consistency):事务在执行之前和执行之后,数据库的状态都必须是合法的,保持数据的一致性和完整性。事务的执行不能违反数据库的完整性约束,转账事务中,如果在第三步和第四步之间系统崩溃,支票账户中也不会损失200美元,因为事务最终没有提交,所以事务中所做的修改也不会保存到数据库中。
隔离性(Isolation):一个事务所做的修改在最终提交以前,对其他事务是不可见的。换句话说,同时运行的事务之间是相互隔离的,避免互相干扰。
持久性(Durability):一旦事务提交,其所做的修改就会永久保存到数据库中,即使发生系统崩溃,也不会丢失已提交的事务数据。
三、隔离级别
隔离级别是数据库管理系统(DBMS)在并发环境下处理多个事务时,用来控制事务之间相互影响的程度。不同的隔离级别提供了不同的平衡点,在数据一致性和系统性能之间进行权衡。SQL标准定义了四种隔离级别,每种隔离级别处理事务之间的交互方式略有不同,每一种级别都规定了一个事务中所做的修改,那些在事务内和事务间是可见的。那些是不可见的,通常较低级别的隔离可以执行更高的并发,系统开销也低。
未提交读(Read Uncommitted):
- 事务可以读取其他事务尚未提交的更改。
- 可能会导致脏读(Dirty Read),即一个事务读取了另一个事务未提交的数据,这些数据可能在随后的回滚中被撤销。
- 适用于对数据一致性要求较低但对性能要求较高的场景。
已提交读(Read Committed):
- 事务只能读取其他事务已经提交的更改。
- 避免了脏读问题,但可能会出现不可重复读(Non-repeatable Read)问题,即同一事务中的相同查询在不同时间可能返回不同的结果,因为在事务进行过程中,其他事务可能会提交新的更改。
- 是许多数据库系统的默认隔离级别,兼顾了一定的一致性和性能。
可重复读(Repeatable Read):
- 确保在同一事务中多次读取同一数据时,结果是相同的,即使其他事务在此期间进行了更新。一方提交了,这一方还是看不见。
- 避免了不可重复读问题,但可能会出现幻读(Phantom Read)问题,即一个事务在读取数据集时,另一个事务插入了新的行,使得第一次读取的结果在后续读取时发生变化。幻读、换行,即一个事务查询一个范围内的的数据,另一个事务也在这个范围内对数据进行了删除、修改,他提交之后,我们依然在另一个事务中看到的是之前的数据而不是修改后的。(面试)
- MySQL InnoDB引擎的默认隔离级别。(面试题)
可串行化(Serializable):
- 最高的隔离级别,通过强制事务顺序执行来避免所有并发问题,包括脏读、不可重复读和幻读。
- 事务仿佛一个接一个地执行,提供了最严格的数据一致性。
- 性能开销最大,适用于对数据一致性要求极高且并发量较低的场景。
四、事务的使用
演示1:
演示2:
演示3:
注意:
平时我们写的一条sql语句,自成一个事务,它内部会自动的先执行begin,sql语句,然后执行commit进行提交;不给你选择的机会。 如果我们在执行sql语句前,手动加上begin, 执行sql语句后,就必须要我们手动加上commit语句了,这样才会向数据库提交。
演示4:
五、隔离级别
演示:
进行其他增删改操作,实际效果也是一样的,即使这边已经提交到数据库,另一边还是无法看到!!!每次读取到的记录都是一样的,这就是可重复读,这样就保证这边这个窗口每次读取的都是一样,但会带来幻读的问题!!!
六、设置隔离级别
至此,数据库的基本就已经介绍完毕,感谢大家的阅读,更多精彩内容见后期,下期再见!