mysql 7
restrict 禁止 删除主表的时候看一下 子表是否引用这个值了
// 模型 ====点击文件 导出SQL
//导出表和视图 然后 运行导出的SQL为没空啊吗 就能新建表了
// 刷新一下就出来了
// 文件同步到数据库 选择默认模式 目标链接 localhost 对比 直接关联数据库 可以连接
// 事务
A账户减少 B账户增加 B账号失败了 ,那么要进行回滚
balance decimal(10,2)// 保留两位小数
select * from account;
update account set balance =balance -10 where id =1
update account set balance =balance +10 where id =2
// id=2的用户 因为balance 字段写错了 或者什么原因 没有加上 ,而id=1的钱已经扣了,所以需要回滚
张三扣钱 和李四加钱做成一个事务
需要两条update语句
记录最后的修改时间 转账时的上次查询的修改时间 和转的那一刻查询的修改时间是否相同
父亲转账 和母亲转账是保持 两个独立的
// 数据库开启自动提交
// 手动提交
SET autocommit=0; //update修改后 select查询 并不会更新了
BEGIN;// 开启后在当前连接可以看到修改 但是到另一个shell命令窗口则看不到数据的变化
update account set balance =balance -10 where id =1
ROLLBACK;// 回滚 不转了
update account set balance =balance +10 where id =2
// 要么提交 要么回滚 两种操作
COMMIT;
// 项目使用mysql
let mysql = require('mysql');
let connection = mysql.createConnection({
host:'localhost',
user:'root',
password:'root',
database:'cms'
})
// 连接数据库
connection.connect()
connection.query('SELECT * FROM account',function(error,results,fields){
console.log(error)
console.log(results)
console.log(fields)// 有哪些字段
})
// 换成下面的方式 用promise
let Promise = require('bluebird')
// 支持mysql的promise
cnpm i bluebird -S
let query = Promise.promisify(connection.query).bind(connection);
// 改变this
query('SELECT * FROM account').then((results)=>{
console.log(results)
})
// 真实项目中 我们会用连接池的方式
let mysql = require('mysql');
const pool = mysql.createConnection({
connectionLimit:10,// 最多10个连接
host:'localhost',
user:'root',
password:'root',
database:'cms'
})
应用服务器和mysql 服务器之间创建一个连接池
刚启动的时候创建3个 就放在那 用完就还回去
10个工作 剩下的90个排队等着
pool.query('SELECT 1+1 AS solution',(err,results,fields)=>{
console.log(results)
})
// mysql中使用事务 判断失败的事务
let mysql = require('mysql');
const connection = mysql.createConnection({
host:'localhost',
user:'root',
password:'root',
database:'cms'
})
connection.connect()
// 开启事务
connection.beginTransaction(function(err){
if(err)throw err;
connection.query('update account set balance =balance -10 where id =1',function(err){
if(err){
connection.rollback(err=>{throw err});
throw err;
} else {
connection.query('update account set balance =balance +10 where id =2',,function(err){
if(err){
connection.rollback(err=>{throw err});
throw err;
}else {
connection.commit(function(err){
console.log('事务提交成功')
})
}
})
}
})
});
// 死锁 双方都在等待对方结束
等待对方把数据释放
// 表级锁 库级锁 行级锁