MySQL事务和隔离机制

2021/11/19 2:09:49

本文主要是介绍MySQL事务和隔离机制,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

MySQL事务和隔离机制

1. 事务

由一组相关的dml语句组成,该组dml语句要么全部成功,要么全部失败

1.1 事务作用

  • 用于保证数据的一致性

1.2 事务和锁

  • 当执行事务操作时,MySQL会在表上加锁,防止其他用户更改表中数据

1.3 事务操作

  • 开始一个事务: START TRANSACTION
  • 设置保存点: SAVEPOINT [保存点名]
  • 回退事务到某个保存点: ROLLBACK TO [保存点名]
  • 回退全部事务: ROLLBACK
  • 提交事务: COMMIT (提交后,所有操作不可回退)
    注: 事务commit后,会自动删除事务中的所有保存点,从当前保存点回退到上一个保存点,当前保存点会被自动删除

1.4 事务注意事项

  • 默认情况下,dml操作是自动提交的,不能回滚
  • 开始一个事务,但没有创建保存点,执行rollback,默认回退到事务开始的状态
  • 可以在事务中创建多个保存点
  • 在事务没有提交前,可以选择回退到哪个检查点
  • MySQL事务机制需要InnoDB的存储引擎才可以使用
  • 开始事务 START TRANSACTION, SET AUTOCOMMIT = off

1.5 MySQL事务ACID

  • 原子性(Atomicity)
    原子性是指事务是一个不可分割的工作单位,事务中的操作要么都执行,要么都不执行
  • 一致性(Consistency)
    事务必须使数据库从一个一致性状态变换到另一个一致性状态
  • 隔离性(Isolation)
    事务的隔离性是多个用户并发访问数据库时,事务为每一个用户开启的事务,不能被其他事物的操作数据干扰,并发多个事务之间要相互隔离
  • 持久性(Durability)
    持久性是指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来即使数据库发生故障也不应该对其有任何影响

2. 隔离机制

多个连接开启各自事务操作数据库中数据时,数据库系统要负责隔离操作,以保证各个连接在获取数据时的准确性

2.1 四种隔离级别

脏读: 一个事务读取另一个事务未提交的改变(UPDATE,INSERT,DELETE)
不可重复读: 一个事务中进行多次查询,因为其他提交事务的修改或删除操作,导致每次查询到的数据都不一样,此时发生不可重复读
幻读: 一个事务中进行多次查询,因为其他提交事务的插入操作,每次查询到的数据不同,此时发生幻读

MySQL隔离级别定义了事务与事务之间的隔离程度

MySQL隔离级别(4种) 脏读 不可重复读 幻读 加锁读
读未提交(Read uncommitted) 不加锁
读已提交(Read committed) 不加锁
可重复读(Repeatable read) 不加锁
可串行化(Serializable) 加锁

2.2 设置隔离级别的方法

  • 查看会话隔离级别 SELECT @@tx_isolation
  • 查看系统当前隔离级别 SELECT @@global.tx_isolation
  • 设置当前会话隔离级别 SET SESSION TRANSACTION ISOLATION LEVEL [隔离级别]
  • 设置系统当前隔离级别 SET GLOBAL TRANSACTION ISOLATION LEVEL [隔离级别]
    注: MySQL默认的隔离级别是REPEATABLE READ,没有特殊要求,一般不修改

全局修改,修改my.ini配置文件,在最后加上
[mysqld]
transaction-isolation = REPEATABLE-READ
//可选参数有:READ-UNCOMMITTED,READ-COMMITTED,REPEATABLE-READ,SERIALIZABLE



这篇关于MySQL事务和隔离机制的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程