mysql

时间:2019-03-15
本文章向大家介绍mysql,主要包括mysql使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

1.事务

1)事务:事务是一个最小的不可再分的工作单元,是一组原子性的SQL操作,事务内的语句,要么全部执行成功,要么全部执行失败;通常一个事务对应一个完整的业务(例如银行账户转账业务,该业务就是一个最小的工作单元)

2)事务有四大特征(ACID):原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)

3)原子性:事务是一个最小的不可再分的工作单元,事务内的语句,要么全部执行成功,要么全部执行失败;事务在执行过程中发生错误,会被回滚(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样

  银行应用是解释事务的一个经典例子。假设一个银行的数据库有两张表:支票(checking)表和储蓄(savings)表。现在要从用户A的支票账户里转移200美元到她的储蓄账户,那么需要至少三个步骤:

  1. 检查支票账户的余额高于200美元
  2. 从支票账户余额中减去200美元
  3. 在储蓄账户余额中增加200美元

        以上三个步骤的操作必须打包在一个事务中,任何一个步骤失败,则必须回滚所有的步骤。

4)一致性:一致性是指数据库总是从一个一致性的状态转换到另一个一致性的状态;在前面的例子中,一致性确保了,即使在执行第三条语句时系统崩溃,支票账户中也不会损失200美元,因为事务最终没有提交,所以事务中所做的修改也不会保存到数据库中

5)隔离性:隔离性是指一个事务所做的修改在最终提交以前,对其他事务是不可见的;在前面的例子中,当还未执行完第三条语句时,此时有另外的一个账户汇总程序开始运行,则其看到支票帐户的余额并没有被减去200美元的

6)持久性:持久性是指一旦事务提交,则其所做的修改会永久保存到数据库

2.隔离级别

1)SQL标准中定义了四种隔离级别(级别递增):未提交读(Read Uncommitted)、提交读(Read Committed)、可重复读(Repeatable Read)、可串行化(Serializable)

2)未提交读

  • 未提交读是指事务中的修改即使未提交,对其他事务也都是可见的
  • 事务可以读取未提交的数据,这也称为脏读:事务A正在访问数据,并且对数据进行了修改,而这种修改还没有提交到数据库中,这时事务B也访问这个数据,然后使用了这个数据。因为这个数据是还没有提交的数据,那么事务B读到是脏数据,假设这时候事务A回滚了
  • 这个级别会导致很多问题,一般很少用

3)提交读

  • 未提交读是指一个事务从开始到提交之前,所做的任何修改对其他事务来说都是不可见的
  • 未提交读避免了脏读
  • 这个级别有时也叫不可重复读:事务A读取了一条数据,然后正在执行某种操作的时候,事务B将这条数据改变(update)了,然后事务A再次读取的时候,却得到的是和上一次读的时候一样的数据(但是其实这个数据已经改变了)
  • 这个是大多数据库默认的隔离级别,但mysql不是

4)可重复读

  • 可重复读是指一个事务里,无论查询多少遍,都是一样的结果,即使另一个事务对数据进行了修改,查到的结果也是永远一样
  • 可重复读避免了脏读,但无法解决幻读:事务A根据条件索引得到N条数据,然后事务B增添insert(或删除delete)了M条符合事务A搜索条件的数据,导致事务A再次搜索发现有N+M条数据了,就像产生了幻觉一样,平白无故的多了几条数据,成为幻读
  • 不可重复读是针对update操作,而幻读针对insert/delete操作
  • InnoDB存储引擎通过多版本并发控制MVCC(Multi - Version Concurrency Control)解决了幻读的问题
  • 可重复读是mysql数据库的默认隔离级别

5)可串行化

  • 可串行化是指一个事务一个事务的执行,一个事务未执行完毕,另一个事务不能执行
  • 可串行化避免了脏读、幻读
  • 可串行化是最高的隔离级别,它会在读取的每一行数据上都加锁,可能会导致大量的超时和锁争用的问题,实际应用中很少采用

2)

3)

4)

5)

6)

1)

2)

3)

4)

5)

6)