MySQL - 事务

67 阅读2分钟

什么是事务

简单来说事务一组SQL的通称,在运行时这组SQL要么同时执行成功,要么同时执行失败

一个完成的SQL应具有ACID的完整特性:

原子性(Atomicity):事务是一个原子操作,它要么全部完成,要么全部不完成。如果事务在执行过程中发生错误,所有已经完成的操作都会被撤销(回滚)到事务开始之前的状态。换句话说,事务是不可分割的单位。

一致性(Consistency):事务执行的结果必须使数据库从一个一致性状态转移到另一个一致性状态。这意味着在事务开始之前和事务结束之后,数据库必须满足某些约束条件,例如主键、唯一性、外键等。

隔离性(Isolation):事务的执行应该与其他事务的执行相互隔离,这意味着事务执行的过程中对其他事务是不可见的。事务应该像它是唯一的事务一样执行,而不受其他事务的干扰。

持久性(Durability):一旦事务被提交,它对数据库的影响应该是永久性的。即使在系统故障的情况下,数据库也应该能够恢复到事务提交后的状态。

隔离级别对比

  • 脏读:
事务A读取了事务B更新的数据,然后B回滚操作,那么A读取到的数据是脏数据
  • 不可重复读:
事务A多次读取同一数据,事务B在事务A多次读取的过程中,对数据作了更新并提交,导致事务A多次读取同一数据时,结果不一致。
  • 幻读:
系统管理员A将数据库中所有学生的成绩从具体分数改为ABCDE等级,但是系统管理员B就在这个时候插入了一条具体分数的记录,当系统管理员A改结束后发现还有一条记录没有改过来,就好像发生了幻觉一样,这就叫幻读
隔离级别脏读不可重复读幻读
读未提交(READ UNCOMMITTED)
读已提交(READ COMMITTED)×
可重复读 (REPEATABLE READ)××
可串行化(SERIALIZABLE)×××

怎么查看现有隔离级别和更换隔离级别

查询目前正在使用的隔离级别

# mysql8
mysql> select @@transaction_isolation;

# mysql5
mysql> select @@tx_isolation;

更换隔离级别

mysql> set session transaction isolation level [隔离级别];