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

1,622 阅读4分钟

官网链接 : www.mysql.com/

mysql 与 sequelize 数据类型 对应关系

// todo

事务(Transaction)与 锁(Lock)

基础

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

为何要添加事务

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

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

并行事务的四大问题:

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

对应隔离级别

  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,没有比原版本高,更新失败

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

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

共享锁:又称为读锁。共享锁就是多个事务对于同一数据可以共享一把锁,都能访问到数据,但是只能读不能修改 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共享锁与排他锁