react 打造页面可视化搭建 3 - mysql 与 sequelize 篇 持续更新

官网连接 : www.mysql.com/mysql

mysql 与 sequelize 数据类型 对应关系

// todosql

事务(Transaction)与 锁(Lock)

基础

事务是数据库执行过程当中的一个逻辑单位,由一系列有限的数据库操做序列构成。被事务包裹起来的这些操做会有共同的执行结果,要么所有成功,要么失败,所有回滚。事务具备4哥特性:原子性(Atomicity,或称不可分割性)、一致性(Consistency)、隔离性(Isolation,又称独立性)、持久性(Durability)typescript

为什么要添加事务

一致性: 更新A数据,与A关联的B,C数据也要更改,如若更改失败,则需所有变回原数据。
隔离性: 某商品库存为10,A操做查询可用库存后库存+1,B在查询期间操做库存-1。那A的查询数据就会有问题。需在B操做期间添加事务,让A查询的数据为B已经修改但为提交的数据。等Bcommit以后再进行A操做数据库

并行事务的问题与隔离级别

并行事务的四大问题:segmentfault

  1. 更新丢失:和别的事务读到相同的东西,各自写,本身的写被覆盖了。(谁写的快谁的更新就丢失了)
  2. 脏读:读到别的事务未提交的数据。(万一回滚,数据就是脏的无效的了)
  3. 不可重复读:两次读之间有别的事务修改。
  4. 幻读:两次读之间有别的事务增删。

对应隔离级别bash

  1. READ UNCOMMITTED:不处理。
  2. READ COMMITTED:只读提交的数据,无脏读;
  3. REPEATABLE READ:加行锁,两次读之间不会有修改,无脏读无重复读;
  4. SERIALIZABLE:加表锁,所有串行,无全部问题。

锁的种类

乐观锁   每次去拿数据的时候都认为别人不会修改,因此不会上锁,可是在更新的时候会判断一下在此期间别人有没有去更新这个数据,可使用版本号等机制并发

例:  A、B两我的同时修改同一条记录,设数据库原有金额是100元,A对金额+100,B往数据库-50,正常结果是150,但因为并发,结果有多是200,或者50解决:A B同时读取出数据版本为1,A对金额+100,并修改数据版本为2,提交数据,此时数据版本为1,更新成功。B读取数据版本1,对金额-50,此时结果为50,并修改数据版本为2,提交数据,对比数据库原版本2,没有比原版本高,更新失败ui

悲观锁   每次去拿数据的时候都认为别人会修改,因此每次在拿数据的时候都会上锁,这样别人想拿这个数据就会block直到它拿到锁spa

乐观锁: 是程序实现,不会存在死锁等问题。他的适用场景也相对乐观。阻止不了除了程序以外的数据库操做比较适合读取操做比较频繁的场景,若是出现大量的写入操做,数据发生冲突的可能性就会增大,为了保证数据的一致性,应用层须要不断的从新获取数据,这样会增长大量的查询操做,下降了系统的吞吐量。
悲观锁: 是数据库实现,他阻止数据库写操做。比较适合写入操做比较频繁的场景,若是出现大量的读取操做,每次读取的时候都会进行加锁,这样会增长大量的锁的开销,下降了系统的吞吐量。3d

共享锁:又称为读锁。共享锁就是多个事务对于同一数据能够共享一把锁,都能访问到数据,可是只能读不能修改 select ... lock in share mode
排他锁:又称为写锁。排他锁就是不能与其余所并存,如一个事务获取了一个数据行的排他锁,其余事务就不能再获取该行的其余锁,包括共享锁和排他锁,可是获取排他锁的事务是能够对数据就行读取和修改 select ...for update

mysql事务处理

提交事务

回滚事务

sequelize 事务锁 处理

export enum LOCK {
  UPDATE = 'UPDATE',
  SHARE = 'SHARE',
  KEY_SHARE = 'KEY SHARE',
  NO_KEY_UPDATE = 'NO KEY UPDATE',
}
复制代码
const transaction = await db.sequelize.transaction({ autocommit: false })
try {
    const component = await Component.findOne({
        where: { id: componentId },
        lock: transaction.LOCK.UPDATE,
      })
    // 修改为功就提交
    await transaction.commit()
 } catch (e) {
    // 若是失败就回滚
    await transaction.rollback()
}
复制代码

使用mysql与sequelize 增删改查与排序分组

新建表

mysql
通用语法: CREATE TABLE table_name (column_name column_type);

CREATE TABLE IF NOT EXISTS `student` ( 
    `id` INT UNSIGNED AUTO_INCREMENT,
    `name` VARCHAR(40) NOT NULL,
    `create_at` DATE,
     PRIMARY KEY ( `id`)
 )ENGINE=InnoDB DEFAULT CHARSET=utf8;
复制代码

sequelize

export class Student extends Model {
  public id!: number
  public name!: string
  public value!: string
  public readonly created_at!: Date
}

export default (sequelize: Sequelize) => {
  Student.init(
    {
      id: {
        allowNull: false,
        autoIncrement: true,
        primaryKey: true,
        type: DataTypes.INTEGER({
          length: 20,
          unsigned: true,
        }),
      },
      name: {
        type: STRING(40),
        allowNull: false,
      },
      created_at: {
        type: DATE,
        allowNull: false,
        defaultValue: DataTypes.NOW,
      },
    },
    {
      sequelize,
      tableName: "student",
      createdAt: "created_at",
      comment: "学生表",
    }
  )
  return Student
}
复制代码

执行的mysql语句

插入

mysql

INSERT INTO table_name ( field1, field2,...fieldN )
                       VALUES
                       ( value1, value2,...valueN );
复制代码

举例执行结果:

sequelize

Student.create({
    name: name,
  })
复制代码

查询

  1. WHERE ``

  2. LIKE

  3. UNION

排序 ORDER BY

分组 GROUP BY

没写完 勿喷 点错了 直接发布了 后期持续更新

refrence

  1. Mysql 事务及数据的一致性处理
  2. mysql共享锁与排他锁
相关文章
相关标签/搜索