MySQL 事务、并发问题、隔离级别

  • 事务一般满足 ACID:

Atomicity、Consistency、Isolation、Durability。

  • 事务的开启与使用

一般,MySQL 都是自动提交事务,即输入命令之后立即提交。这由变量 autocommit 控制,可以通过以下命令查看和修改:

注意:MyISAM 存储引擎并不支持事务,测试时注意。

show variables like 'autocommit';
set autocommit = on;

使用如下开启事务:

begin work;
start transaction;

两者作用差不多。

当希望提交事务时,输入如下命令:

commit;

隐式提交事务,即开启了一个事务,当进行一些特殊操作时会自动提交事务,尽管你并没有显式输入 commit:

  • DDL 语句的输入,比如 CERATE、ALTER、DROP
  • 修改了 mysql 数据库中的表,比如 ALTER USER、CREATE USER、DROP USER、GRANT、RENAME USER、SET PASSSWORD
  • 重新开始了另一个事务
  • LOCK TABLES、UNLOCK TABLES
  • ...

当希望回滚使用:

rollback;

在事务中还可以设置保存点:

savepoint 保存点名称;

指定回滚点:

rollback to 保存点名称;
  • 隔离级别、隔离性
  脏读 不可重复读 幻读
读未提交(read-uncommitted)
读已提交(read-committed)  

可重复读(repeatable-read)    
串行化(serializable)      

脏读:事务 A 执行过程中,对某数据进行了修改,能被事务 B 及时获取到,事务 B 出现脏读;

不可重复读:事务 A 第一次获取某值与第二次某值之间被事务 B 修改了这个值,因此事务 A 不可以重复读取这个值;

幻读:事务 A 检查不存在主键为 1 的记录后意图插入,事务 B 抢先一步插入了主键为 1 的数据,导致事务 A 主键冲突失败;或者取款时,明明看到卡里有余额,却取款失败。

臆测:

  • 读未提交几乎没有进行任何隔离,数据随意共享。
  • 读已提交进行了一定的隔离,但是会出现如下图的情况,隔离的并不很好,因此不可重复读:

  • 可重复读,通过 MVCC 机制实现。

MySQL 默认的隔离级别是 repeatable-read,而且 MySQL 的可重复读也一定程度保证了不会出现幻读的导致的错误,但是幻读依然存在。

发布了48 篇原创文章 · 获赞 2 · 访问量 6349

猜你喜欢

转载自blog.csdn.net/qq_39291919/article/details/99164493