zoukankan      html  css  js  c++  java
  • MySql——事务控制语言(DTL)

    什么是事务(控制台只能是内存的操作)

    通常,在此之前,我们说,一条语句使用一个分号(;)来结束,并得到执行。

    那么我们说,这个“一次性执行”的过程,可以称为“一个事务”。

    简单来说,“一条sql语句,就是一个事务”。

    则:

    数据库(自然包括mysql数据库)中的事务,是指,可以将“多条语句”的执行,当作“一条语句”来看到的一种内部机制。

    即:“事务”是一种可以保证“多条语句一次性执行完成”或“一条都不执行”的机制。

    为什么需要事务?

    看一个实际应用需求(银行存款):表名cunkuan

    id

    账户名

    存款

    1

    test1

    1000

    2

    test2

    5000

    3

    test3

    3000

    现在,test1突然需要一笔钱,买iPhone8,向test2借钱4000

    银行转账:

    第一步: update  cunkuan  set 存款=存款-4000  where id=2

    第一步做完,突然断电了!

    第二步: update  cunkuan  set 存款=存款+4000  where id=1

    则如果没有事务,就可能发生这种事情(惨案)。

    如果有了事务,则就可以避免该事情。

    事务可以看作是一个“容器”,将多条语句,放入该容器,最后,只要一个命令行,来决定其中的所有语句是否“执行”。

    事务的特点

    原子性:一个事务中的所有语句,应该做到:要么全做,要么一个都不做;

    一致性:让数据保持逻辑上的“合理性”,比如:一个商品出库时,既要让商品库中的该商品数量减1,又要让对应用户的购物车中的该商品加1;

    隔离性:如果多个事务同时并发执行,但每个事务就像各自独立执行一样。

    持久性:一个事务执行成功,则对数据来说应该是一个明确的硬盘数据更改(而不仅仅是内存中的变化)。

    事务模式:

    事务模式:就是让每条执行语句是否当作“一个事务”来看到的设定项。

     

    mysql默认安装好之后,其事务模式是:一条语句当作一个事务。

    比如:

    原来数据:

    执行插入:

    结果:

    我们可以将其修改为:事务需要“认可”模式:

    set  autocommit = 0; //false,关闭该模式,即此时不再是一条语句一个事务了。

    //结果是:必须使用commit语句才能够生效。

     

     

     

    然后插入:

     

    s刷新:

     

    可见,没有变化。

    然后再执行commit

     

    再刷新;

    注意:autocommit的设置值,只是影响通常情况下都每条语句的默认行为(自动提交还是等着commit提交)

     

    不管autocommit的值是什么(1,0),我们也仍然可以使用事务的完整流程模式来实现事务,如下:

    事务的基本实现流程:

    1,声明事务开始:start transaction;

    2, 设定多条要执行的具体语句,比如:insertupdatedelete, select。。。其实就是执行,只是这些执行的语句,并不“生效”——其只是内存状态下的执行,而不是物理状态的执行。

    3,判断是否需要执行该些语句:

    if( 判断是否有错误){

    //执行——才针对执行了物理性改变——即生效。

    commit;

    }

    eslse{

    //回滚——不执行任何语句。

    rollback;

    }

    判断是否有错误通常分这两种环境:

    1,如果是cmd中,直接观察是否出错。

    2,如果是php程序中,那就需要使用 mysql_error()函数来判断是否有错。

     

    下来来使用事务完整转账这件事情(假设为cmd模式):

    start  transaction;

    #第一步:

    update  cunkuan  set 存款=存款-4000  where id=2

    #第一步做完,突然断电了?

    #第二步:

    update  cunkuan  set 存款=存款+4000  where id=1

    则如果这两条语句都没有错误,就可以:

    commit;

    但,如果其中发生了错误,则可以:

    rollback

     

     

     

  • 相关阅读:
    【译文】四十二种谬误(一)
    .NET笔记(二)
    设计模式C#实现(十六)——中介者模式
    设计模式C#实现(十五)——命令模式
    《程序员修炼之道》笔记
    《学会提问》读书笔记
    设计模式C#实现(十四)——责任链模式
    设计模式C#实现(十三)——享元模式(蝇量模式)
    学以致用——读《学会提问》
    访问苹果开发者网站太慢
  • 原文地址:https://www.cnblogs.com/lemon-Net-Skill/p/9502370.html
Copyright © 2011-2022 走看看