官網連接 : www.mysql.com/mysql
// todosql
事務是數據庫執行過程當中的一個邏輯單位,由一系列有限的數據庫操做序列構成。被事務包裹起來的這些操做會有共同的執行結果,要麼所有成功,要麼失敗,所有回滾。事務具備4哥特性:原子性(Atomicity,或稱不可分割性)、一致性(Consistency)、隔離性(Isolation,又稱獨立性)、持久性(Durability)typescript
一致性: 更新A數據,與A關聯的B,C數據也要更改,如若更改失敗,則需所有變回原數據。
隔離性: 某商品庫存爲10,A操做查詢可用庫存後庫存+1,B在查詢期間操做庫存-1。那A的查詢數據就會有問題。需在B操做期間添加事務,讓A查詢的數據爲B已經修改但爲提交的數據。等Bcommit以後再進行A操做數據庫
並行事務的四大問題:segmentfault
對應隔離級別bash
樂觀鎖 每次去拿數據的時候都認爲別人不會修改,因此不會上鎖,可是在更新的時候會判斷一下在此期間別人有沒有去更新這個數據,可使用版本號等機制併發
例: 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
提交事務
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
通用語法: 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 );
複製代碼
舉例執行結果:
Student.create({
name: name,
})
複製代碼
WHERE ``
LIKE
UNION
沒寫完 勿噴 點錯了 直接發佈了 後期持續更新