美文网首页程序员
SQL-TCL(14)事务控制语言

SQL-TCL(14)事务控制语言

作者: 小白201808 | 来源:发表于2018-09-01 07:57 被阅读55次

    Transaction Control language

    事务:(存储引擎innodb支持事务)

    一个或一组sql语句组成一个执行单元,这个执行单元要么全部执行,要么全部不执行。如:转账。
    

    特点

    (ACID)
    原子性(Atomicity):一个事务要么都执行,要么都回滚(不可再分割)
    一致性(Consistency):保证数据的状态操作前和操作后保持一致
    隔离性(Isolation):多个事务同时操作相同数据库的同一个数据时,一个事务的执行不受另外一个事务的干扰
    持久性(Durability):一个事务一旦提交,则数据将持久化到本地(则会永久的改变数据库的数据),除非其他事务对其进行修改
    

    相关步骤:

    1、开启事务
    2、编写事务的一组逻辑操作单元(多条sql语句)
    3、提交事务或回滚事务
    
    #演示事务的使用步骤:(以转账为例)
    #开启事务
    set autocommit = 0;
    start transaction;
    #编写一组事务语句
    update account set balance =500 where usename ='张无忌';
    update account set balance =1500 where usename ='郭襄';
    #结束事务
    commit;
    

    事务的分类:

    隐式事务,没有明显的开启和结束事务的标志

    比如
    insert、update、delete语句本身就是一个事务
    

    显式事务,具有明显的开启和结束事务的标志

       前提:取消自动提交功能
       set autocommit=0;
        1、开启事务
        start transaction;可省略
        2、编写事务的一组逻辑操作单元(多条sql语句)
        insert
        update
        delete
        设置回滚点:savapoint 回滚点名;
        3、提交事务或回滚事务
        提交 :commit;
        回滚:rollback;
        回滚到指定的地方:rollback to 回滚点名;
    

    使用到的关键字

    set autocommit=0;
    start transaction;
    commit;
    rollback;
    
    savepoint  断点
    commit to 断点
    rollback to 断点
    

    事务的隔离级别:

    事务并发问题如何发生?

    当多个事务同时操作同一个数据库的相同数据时
    

    事务的并发问题有哪些?

    1.脏读:一个事务读取到了另外一个事务未提交的数据,读到其他事务的未提交的“更新”数据
    2.不可重复读:同一个事务中,多次读取到的数据不一致
    3.幻读:一个事务读取到了另外一个事务未提交的数据,只是读到的是其他事务“插入”的数据
    

    如何避免事务的并发问题?

        通过设置事务的隔离级别
                              脏读          不可重复读       幻读
                              
        1、READ UNCOMMITTED     √            √               √
        
        
        2、READ COMMITTED       x             √               √
        
        3、REPEATABLE READ      x            x               √                  
        
        4、SERIALIZABLE(串行化) x            x            x
        
    

    设置隔离级别:(mysql 默认级别为REPEATABLE READ )

    mysql> show global variables like '%isolation%';
    +-----------------------+-----------------+
    | Variable_name         | Value           |
    +-----------------------+-----------------+
    | transaction_isolation | REPEATABLE-READ |
    +-----------------------+-----------------+
    1 row in set (0.00 sec)
    
    set session|global  transaction isolation =' 隔离级别名';
    
    mysql> set global transaction_isolation ='read-committed';
    Query OK, 0 rows affected (0.00 sec)
    
    mysql> show global variables like '%isolation%';
    +-----------------------+----------------+
    | Variable_name         | Value          |
    +-----------------------+----------------+
    | transaction_isolation | READ-COMMITTED |
    +-----------------------+----------------+
    1 row in set (0.00 sec)
    
    

    查看隔离级别也可以(前提是知道具体变量名):

    select @@transaction_isolation;
    
    mysql> select @@transaction_isolation;
    +-------------------------+
    | @@transaction_isolation |
    +-------------------------+
    | REPEATABLE-READ         |
    +-------------------------+
    1 row in set (0.00 sec)
    

    注:这是本人的学习笔记及练习,如果有错误的地方望指出一起讨论,谢谢!

    相关文章

      网友评论

        本文标题:SQL-TCL(14)事务控制语言

        本文链接:https://www.haomeiwen.com/subject/rmfrwftx.html