• 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语句才能够生效。

            然后插入:


            刷新:可见,没有变化。


            然后再执行commit:


            再刷新;

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

            不管autocommit的值是什么(1,0),我们也仍然可以使用事务的完整流程模式来实现事务,如下:
            事务的基本实现流程:
            1,声明事务开始:start transaction;
            2, 设定多条要执行的具体语句,比如:insert, update, delete, 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;

  • 相关阅读:
    LeetCode105. 从前序与中序遍历序列构造二叉树
    Flask 基础
    24个常用 Python 实现
    大佬的编码建议,让你的代码更pythonic
    rest-framework框架之序列化
    路飞学城项目之加入结算中心接口
    java异常与spring事务关系的知识点查漏补缺
    iserver-数据库型数据源导入后原dataset名称和数据库表名不一致的问题
    解决数据读取的负载均衡的问题
    Nginx反向代理、CORS、JSONP等跨域请求解决方法总结
  • 原文地址:https://www.cnblogs.com/ybygb-geng/p/9533786.html
Copyright © 2020-2023  润新知