目录
1、什么是事务
在MySQL中,事务是一组可以作为单个工作单元来执行的操作。事务确保数据库在并发环境下的数据一致性和完整性。MySQL中的事务主要用于处理多个操作步骤的执行,以确保所有步骤都成功完成,否则,系统将回滚到事务开始之前的状态。
MySQL事务有以下几个关键特性,通常称为ACID特性:
-
原子性(Atomicity):事务中的所有操作要么全部执行成功,要么全部不执行。即使在系统崩溃的情况下,也不会存在部分成功、部分失败的状态。
-
一致性(Consistency):事务执行前后,数据库从一个一致的状态转换到另一个一致的状态。事务的执行不会破坏数据库的完整性约束。
-
隔离性(Isolation):事务的执行过程与其他事务相互隔离,避免相互干扰。一个事务的中间状态对其他事务是不可见的。
-
持久性(Durability):一旦事务提交,其对数据库的改变是永久性的,即使系统崩溃,事务的结果也会被保存。
在MySQL中,使用事务通常涉及以下几个SQL命令:
START TRANSACTION
:开始一个新的事务。COMMIT
:提交事务,将所有对数据库的改变永久保存。ROLLBACK
:回滚事务,撤销事务中的所有操作
最经典的事务的案例就是:
A向B转账500,转账成功,A扣除500元,B增加500元,原子操作体现在要 么都成功,要么都失败 在转账的过程中,数据要一致,A扣除了500,B必须增加500
在转账的过程中,隔离性体现在A像B转账,不能受其他事务干扰 在转账的过程中,持久性体现在事务提交后,要把数据持久化
2、并发事务带来的问题
2.1、脏读
当一个事务正在访问数据并且对数据进行了修改,而这种修改 还没有提交到数据库中,这时另外一个事务也访问了这个数据,因为这个数据是还没有提交的数据,那么另外一个事务读到的这个数据是“脏数据”,依据“脏数据”所做的操作可能是不正确的。
2.2、不可重复读
比如在一个事务内多次读同一数据。在这个事务还没有结束时,另一个事务也访问该数据。那么,在第一个事务中的两次读数据之 间,由于第二个事务的修改导致第一个事务两次读取的数据可能不太一样。 这就发生了在一个事务内两次读到的数据是不一样的情况,因此称为不可重复读。
2.3、幻读
幻读与不可重复读类似。它发生在一个事务 (T1)读取了几行数据,接着另一个并发事务(T2)插入了一些数据时。在随后的查询中,第一个事务(T1)就会发现多了一些原本不存在的记录,就 好像发生了幻觉一样,所以称为幻读。
3、Mysql的隔离级别
- 未提交读(read uncommitted)它解决不了刚才提出的所有问 题,一般项目中也不用这个。
- 读已提交(read committed)它能解 决脏读的问题的,但是解决不了不可重复读和幻读。
- 可重复读 (repeatable read)它能解决脏读和不可重复读,但是解决不了幻读,这个 也是mysql默认的隔离级别。
- 串行化(serializable)它可以解决刚 才提出来的所有问题,但是由于让是事务串行执行的,性能比较低。所以, 我们一般使用的都是mysql默认的隔离级别:可重复读