字节青训营RDBMS学习| 青训营

120 阅读2分钟

事务的四个性质ACID

  • Atomic 原子性:这个操作是最小操作,不能分割
  • Consistent 一致性
  • Isolation 隔离性:一个事务不被其他事务所干扰,独立进行
  • Durable 持久性:事务提交后,对数据库的影响可以持久存在

一致性范畴很大,它是用来形容业务不出现逻辑上的错误与矛盾;可以是两个表之间的数据要保持某种一致的数学关系或逻辑关系,也可以是两个数据库,主库与从库之间数据保持一致性,也可以是和缓存之间保持数据的一致性;

应该说一致性是一种我们想要的结果,一种目的,只有保证了事务的持久性、原子性、隔离性之后,一致性才能得到保障。也就是说 A、I、D 是手段,C 是目的!

开启事务的指令

  1. 显式启动事务语句, begin 或 start transaction。配套的提交语句是 commit,回滚语句是 rollback。
  2. 参数设为1,每次执行语句会自动开启事务和提交事务。可以防止长事务出现。
start transaction / begin;
SQL1;
SQL2...
commit / rollback;

实际操作建议 参数设为1,然后具体操作时通过显示命令来开启事务和提交事务;

事务隔离级别

  1. 读未提交 READ-UNCOMMITTED RU :允许读到未提交的数据
  2. 读已提交 READ-COMMITTED RC :事务能读到其他事务已经提交的事务
  3. 可重复读 REPEATABLE-READ RR :一个事务内多次读取数据,都和事务的一致性视图一致。
  4. 串行化 SERIALIZABLE :事务按照顺序执行,不支持并发事务

默认的事务隔离级别是 :可重复读 REPEATABLE-READ

MySQL事务隔离级别都是基于锁实现的吗?

MySQL 的隔离级别基于锁和 MVCC 机制共同实现的。

SERIALIZABLE 隔离级别是通过锁来实现的,READ-COMMITTED 和 REPEATABLE-READ 隔离级别是基于 MVCC 实现的。不过, SERIALIZABLE 之外的其他隔离级别可能也需要用到锁机制,就比如 REPEATABLE-READ 在当前读情况下需要使用加锁读来保证不会出现幻读。

并发事务带来的问题?

  1. 脏读:指事务读到了其他事务尚未提交的数据,然而这个数据可能被回滚;RU会有脏读现象
  2. 不可重复读:不可重复度是指事务中前后两次对同一数据读到的值可能不一致,RU,RC都会有这个现象,可重复读隔离级别解决了这个事情
  3. 幻读:指的是一个事务在前后两次查询同一个范围的时候,后一次查询看到了前一次查询没有看到的行;只有当前读才会产生幻读。