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共享鎖與排他鎖
相關文章
相關標籤/搜索