官网连接 : 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
没写完 勿喷 点错了 直接发布了 后期持续更新