mysql 引擎
存储一份文件,
不管用什么存储方式,不变的数据,变化的时存储的格式
总结:engine引擎就是Mysql存储数据的不同方式
就像一部电影,内容一样
avi,mp3,mkv。。。就是不同的engine
create table(
)engine myisam charset utf8;
存储引擎与其特点:
myisam innodb
批量出入的速度 高 低
事务安全 否 支持
锁机制 表锁 行锁
建立两张表,但是引擎不一样
create table v1(
uname varchar(20),
money int
)engine myisam charset utf8;
create table v2(
uname varchar(20),
money int
)engine innodb charset utf8;
两张表在存储数据上是一样的
举例:
1.如果多人买火车票,用两个窗口来模拟,2个人在购买,
只有一张票,几乎同时查询,
两人同时下单购买
2.银行转账
张三给李四转500块,
张三-500,李四+500
这两部必须都完成了,转账才完成
像这种,2步或n步,从逻辑上讲,是一个“原子操作”
即,要么成功,要么不成功
如何保障这种特性?
答:事务
事务特性:
1。原子性:2步或n步操作,逻辑上不可分割,
通俗说:要么成功,要么都不成功
演示事务的原子性:
如何使用事务呢?
start transaction 开启事务
张三加500,李四减500
两步完成了,事务完成了,
提交这个事务:commit
事务的体现呢?
再次开启事务,体现事务的原子特性
张三加500,
接下来扣李四500失败了,
部分失败,则之前的成功操作怎么处理?
答:回滚。rollback
此时张三的钱变回初始值
2.一致性:
指操作前后,值的变化,逻辑上成立
3.隔离性:
事务结束前,操作的每一步所带来的影响,别的会话都不可见
commit指令输入后才代表事务结束
4.持久性
事务一旦完成,无法撤销
比如:ATM取钱
账户-500
吐钞500,钱装兜里,
这时 ,出错了,如何撤销这个事务?
答:事务不能撤销,但确实是一次错误的交易,怎么办?
只能在错一次“补偿事务”,即如果多吐了500,只能从你的账户在扣除500
事务
1.什么是事务
transaction
一个最小的不可再分的工作单元
通常一个事务对应一个完整的业务
一个完整的业务需要批量的DML语句共同联合完成
事务只和DML语句有关系,或者说DML语句才有事务
以上所描述的批量的DML语句数量与业务逻辑有关,逻辑不同,DML语句数量不同
执行银行转账操作,账户转账是一个完整的业务,最小的单元,不可再分
也就是银行账户转账是一个事务
update t_act set balance=10000 where action='1';
update t_act set balance=20000 where action='2';
以上两条DML语句必须同时成功或同时失败
当第一条DML语句执行成功后,并不能将底层数据库中第一个账户的数据修改,
只是将操作记录一下,这个记录是在内存中完成的,当第二条DML语句执行成功后,
和底层数据库中的数据完成同步,若第二条DML语句执行失败,清空所有的历史操作记录。
2.事务的四个特性(ACID)
-原子性
事务时最小的工作单元,不可再分
-一致性
事务要求所有份DML语句操作的时候,必须保证同时成功或者失败
-隔离性
事务A和事务B之间具有隔离
-持久性
是事务的保证,事务终结的标志,(内存中的数据持久到硬盘文件中)
3,关于一些术语
-开启事务 start transaction
-事务结束 end transaction
-提交事务 commit transaction
-回滚事务 rollback transaction
4.与事务有关的两条重要的sql语句(TCL)
commit 提交
rollback 回滚
5.事务开启的标志
任何一条DML语句(insert update delete)执行,标志事务开启
事务结束的标志
提交或者回滚
提价:成功的结束 将所有的DML语句操作历史记录和底层硬盘文件中的数据来一次同步
回滚:失败的结束 将所有的DML语句操作历史记录全步清空
6.在事务进行过程中,未结束之前,DML语句是不会更改底层数据库文件中的数据,只是将历史操作记录一下,
在内存中完成记录,只有在事务结束的时候,而且是成功的结束时候才会修改底层硬盘文件的数据
7.在mysql数据库中,事务的提交与回滚
-在mysql数据库中,默认情况下,事务是自动提交的
也就是说,只要执行一条DML语句,开启了事务同时也提交了事务
-这种自动提交机制是可以关闭的
1.start transaction;手动开启事务
commit ;手动提交事务(事务成功的标志)
rollback;手动回滚事务(事务失败的标志)
2.第二种方式
set autocommit = off;
-打开自动提交
set autocommit = on;
以上机制只对当前会话有效
8.事物的隔离性(isolation)
隔离性有隔离级别(4个)
-读未提交 read uncommited
-读已提交 read committed
-可重复读 repeatable read
-串行化 serializable
read uncommited
-事务A和事务B,事务A未提交的数据, B可以读取到
这里读取到的数据可以叫“脏数据”或者叫“dirty read
隔离级别最低,理论存在
数据库的默认隔离级别高于该隔离级别
read commited
数据A提交后的数据,B才可以读取到
这种隔离级别可以避免脏数据
这种隔离级别会导致不可重复读取
oracle 数据库默认的隔离等级
repeatable read
事务B可重复读取数据
A提交之后数据,B读取不到
mysql数据库默认的隔离级别
虽然可以重复读取数据,但会导致“幻象读”
serializable
事务A与事务B, A在操作数据库表中数据时,事务B只能排队等待
很少使用,用户体验不好,吞吐量太低
可避免幻想读,每一次读取的都是表种真是的记录
A与B串行执行,不在并发
9.设置事务的隔离级别
-第一种 :修改my.ini配置文件
-第二种:使用命令方式实现隔离级别
set (无/session/global) transaction isolation level (isolation-level) 设置于会话
isolation-level 可选值:read uncommited
read commited
repeatable read
serializable
设置事务的隔离级别作用于全局
set global transaction isolation level()
10.查看隔离级别
select @@tx_isolation;
select @@session.tx_isolation;
select @@global.tx_isolation;