– 转账就是一组操作,要’ at line 20
– MySQL的存储引擎:表数据的存储格式
– 我有一首诗,我现在想让你把这首诗记下来,你会采用什么方式?
– 1.存到电脑上
– 2.写到本子上
– 3.记录到脑子里
– 变得是什么?不变的是什么?
– 不变是内容,变的存储的方式
– 表数据最终都是存储到电脑硬盘里面,我可以选择存储的方式
– 同一个电影,可以有n种格式,mp4 avi 清晰度和文件大小都不一样
– 不管采用哪种方式存储,数据是不变的
– myisam:张马虎,速度高,不支持事务安全,不安全,表锁。效率高
– INNODB:李小心,速度慢, 支持事务安全,行锁,效率低
– MyISAM不支持事务、也不支持外键,但其访问速度快,对事 务完整性没有要求
– ② InnoDB存储引擎提供了具有提交、回滚和崩溃恢复能力的事 务安全。
– 但是比起MyISAM存储引擎,InnoDB写的处理效率差一些并且会占用更多的磁盘空间以保留数据和索引。
– 如何选择表的存储引擎
– ①如果你的应用是不需要事务,处理的只是基本的CRUD操作,那么MyISAM是不二选择
– ②一般来说,如果需要事务支持,并且有较高的并发读写 频率,InnoDB是不错的选择。
– 如果不标明存储引擎,默认都是myiasm,
– 修改存储引擎语法:
– ALTER TABLE 表名
ENGINE = 储存引擎;
– 博文: 账户8000 支入:+2000
– 具澳:账户8000 支出:-2000
– 在数据库中是一个什么操作?转账
update ac set m-2000 where
update ac set m+2000 where
– 转账就是一组操作,要么全部执行成功,要么全部执行失败,
– 如果有其中一个执行成功一个执行失败了,就会有问题
– 什么是事务?
– 指的是一组操作要么全部执行成功,要么全部执行失败
create table account(
aid int not null PRIMARY key,
aname VARCHAR(10) not null,
money DECIMAL(9,2)
)charset=utf8,ENGINE=INNODB;
INSERT INTO account(aid,aname,money) VALUES(1,‘博文’,8000);
INSERT INTO account(aid,aname,money) VALUES(2,‘具澳’,8000);
SELECT * from account;
– 模拟网络故障
update account set money=money-2000 where aname=‘具澳’;
update account set money=money+2000 where aname=‘博文’;
update account set money=money+2000 where aname=‘博文’;
– 银行转账的规则变了:先加后减
– 原子性:要求全部执行成功或者全部执行失败
– 隔离性:在所有操作未完成之前,其他会话不能看到中间过程
– 一致性:事务发生前和发生后的总金额依然匹配
– 持久性:事务产生的影响是不能撤销的
– commit:提交事务:程序没有异常
– ROLLBACK:回滚事务:程序在运行期间出现了异常,回滚到未修改的状态
– 禁止自动提交
set autocommit=0;
– 开启事务
start TRANSACTION;-- transaction
update account set money=money-2000 where aname=‘博文’;
update account set money=money+2000 where aname=‘具澳’;
– 提交事务
COMMIT;
– 禁止自动提交
set autocommit=0;
– 开启事务
start TRANSACTION;
update account set money=money-2000 where aname=‘博文’;
update account set money=money+2000 whereaname=‘具澳’;
– 提交事务
ROLLBACK;
– 隔离级别:
– 读未提交(Read uncommitted)
– 读已提交(Read committed)
– 可重复读(Repeatable read)
– 可串行化(Serializable )
– 隔离级别定义了事务与事务之间的隔离程度。默认隔离级别:可重复读Repeatable read
– 脏读:
– 不可重复读
– 主要作用在修改
– 幻读:作用在添加和删除
– 同一查询在同一事务中多次进行,由于其他提交事务所做的插入操作,每次返回不同的结果集,此时发生幻读。
– 1.查看当前会话隔离级别
– select @@tx_isolation;
– 2.查看系统当前隔离级别
– select @@global.tx_isolation;
– 3.设置当前会话隔离级别
– set session transaction isolation level repeatable read;
set session transaction isolation level Read uncommitted ;
– 4.设置系统当前隔离级别
– set global transaction isolation level repeatable read;
– 可串行化效率太低了,虽然三个都可以避免
– 5. mysql 默认的事务隔离级别是 repeatable read ,一般情况下,没有特殊要求,没有必要修改(因为该级别可以满足绝大部分项目需求)