mysql引擎与事务

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;

 

 

   

posted @ 2019-05-24 12:27  FAJ  阅读(350)  评论(0编辑  收藏  举报