数据库基础, 事务的ACID特性, 并发控制, 隔离级别, 乐观锁和悲观锁

事务

  事务是数据库并发控制的基本单位。

  事务可以看作是一系列SQL语句的集合。

  事务要么全部执行成功,要么全部执行失败(回滚)。

  例子:转账操作。

 

ACID:

原子性(Atomicity): 一个事务中,所有操作全部完成或全部失败。

一致性(Consistency): 事务开始和结束之后,数据的完整性没有被破坏。

隔离性(Isolation): 允许多个事务同时对数据库进行修改和读写。

持久性(Durability): 事务结束之后,修改是永久的,不会丢失。 

 

如果不对事务进行并发控制会产生哪些后果

  • 幻读(phantom read):一个事务第二次读,读出来第一次没有的结果。
  • 非重复读(nonrepeatable read):一个事务重复读两次出现不同的结果。
  • 脏读(dirty read): 一个事务读取到另一个事务没有提交的修改。
  • 修改丢失(lost update): 并发写入造成其中一些修改丢失。

 

为了解决并发控制异常, 定义了四种隔离级别

  • 读未提交: 别的事务可以读取到未提交读改变。
  • 读已提交:只能读取已经提交的数据。
  • 可重复读:同一个事务先后查询的结果一样。
  • 串行化: 事务完全串行化的执行,隔离级别最高,执行效率最低。

 

如何解决数据库会有数据重复问题

  • 使用数据库唯一索引
  • 使用队列执行异步写入
  • 使用redis等实现分布式锁

 

乐观锁和悲观锁

  • 悲观锁:先获取锁再进行操作。一锁二查三更新( select for updete)
  • 乐观锁: 先修改,更新的时候发现数据已经变了就回滚(check and set) 一般通过版本号和时间戳实现。
  • 需要根据响应速度、冲突频率、重试代价来判断使用哪一种。

 

常用数据类型

  • 字符串: CHAR(存储定长字符串), VARCHAR(存储不定长的字符串), TEXT(文章之类的,不存储大小写), TINYTEXT(最大长度255,适用于存储对大小写要求严格的二进制数据)。
  •  数字:

     

     

  • 日期和时间:

     

     

mysql的两种引擎

        事务     外键            行锁和表锁      全文索引

  InnoDB:   支持     支持            支持               不支持

  MyISAM: 不支持   不支持     不支持            支持

 

posted @ 2020-04-02 20:36  DRQ丶  阅读(202)  评论(0编辑  收藏  举报