MySQL 事务性及特性ACID

数据库事务

事务逻辑上指一组操作,组成这组操作的各个单元,要不全部成功,要不全部不成功。

MySQL事务现在的默认存储引擎是InnoDB,事务隔离级别是重复读repeatable read。

重复读 repeatable read:InnoDB的默认隔离级别。可以防止任何被查询的行被其他事务更改,从而阻止不可重复的读取。它使用中度严格的锁定策略,以便事务内的所有查询都会查看同一快照中的数据,即在事务开始时的数据。

当创建查询事务时,事务一直没有进行更新,每次查询到的数据都是之前查询结果的快照。

问题:数据库插入新数据后,查询不到???

解决方案:

  1. 修改事务隔离级别。改为支持不可重复读的隔离级别。
  2. 每次查询后更新事务:#方法1,每次查询后进行commit操作,进行事务更新。#方法2,创建connect连接时,autocommit=True,自动进行commit提交。
  3. 关闭数据库的事务(修改存储引擎)。只有InnoDB存储引擎才支持事务。

事务特性 ACID

  • 原子性 Atomicity:指事务是一个不可分割的工作单位,事务中的操作要么都发生,要不都不发生。
  • 一致性 Consistency:事务前后数据的完整性要保持一致。在事务执行之前数据库是符合数据完整性约束的。
  • 隔离性 Isolation:指多个用户并发访问数据库时,一个用户的事务不能被其他用户的事务所干扰,多个并发事务之间数据要相互隔离。
  • 持久性 Durability:指一个事务一旦被提交,它对数据库的改变就是永久性的。

隔离性

隔离级别 脏读 不可重复读 幻读
读未提交 read uncommitted yes yes yes
读已提交 read committed no yes yes
可重复读 repeatable read no no yes
可串行读 serializable no no no

脏读:一个事务读取到了另一个事务未提交的数据。

不可重复读:在一个事务内读取表中的某一行数据,多次读取结果不同。

      一个事务读取到了另一个事务已经提交的数据-增删改操作。

幻读:一个事务内读取到了别的事务插入的数据,导致前后读取不一致。

可重复读:确保同一事务的多个实例在并发读取数据时,会看到同样的数据行。

可串行化:在每个读的数据行上加上共享锁。

posted @ 2020-01-03 17:42  糖醋排骨加辣椒  阅读(136)  评论(0编辑  收藏  举报