zoukankan      html  css  js  c++  java
  • mysql详解10:事务

    事务是代表单个工作单元的一组sql语句 ,所有的语句都运行成功,否则事务将运行失败。
    原子性
    一个事务包含多个操作 这些操作要么全部执行,要么全部不执行。在某个操作失败后,会全部回滚。
    一致性
    系统从一个一致的状态到另一个一致的状态
    隔离性
    事务之间相互隔离,当有同样的数据被更改时各自受到保护 ,如果多个事务想更改相同的数据,受影响的行就会被锁定,一次只允许一个事务可以更新行,等这个事务完成,其他事务才能进行。
    持久性
    一旦事务提交,产生的更改是永久的

    创建事务

    START TRSNSACTION;

    INSERT INTO orders(customer_id,order_date,status ) values (1,”2019-01-01”,1);
    INSERT INTO order_items values (LAST_INSERT_ID(),1,1);

    COMMIT;
    ROLLBACK; //回退事务中的所有修改

    并发和锁定
    当一个用户修改其他用户正在检索或者修改的数据时,并发可能会成为一个问题。
    丢失更新
    脏读 :一个事务读取了尚未提交的数据
    不可重复读:一个事务两次读取的数据不一致 首次读取的数据
    幻读:在查询之后才增加的数据
    隔离级别
    读未提交 READ UNCOMMITTED
    读已提交 READ COMMITTED 解决脏读
    可重复读 REPEATABLE READ 解决不可重复读 确保数据更改对事务不可见
    可序化 SERIALIZABLE 解决幻读 如果数据在期间修改了 我们的事务就会待定

    默认级别 可重复读 更高级别的隔离 会有更少的并发问题 但是性能和拓展性会降低
    查看隔离级别
    SHOW VARIABLES LIKE 'transaction_isolation';
    //全局的事务
    SET GLOBAL TRANSACTION ISOLATION LEVEL SERIALIZABLE;
    某个会话或者连接的
    SET SESSION TRANSACTION ISOLATION LEVEL SERIALIZABLE;

    如果想感受各种并发问题,可以开多个对话,修改事务的隔离级别

    死锁
    如果更新时,遇到其它事务正在执行更新语句 ,必须等其他事务执行完了提交了,才能执行更新语句
    当不同事务 互相拿了别的事务所需的锁 互相等待 形成死锁

    检查一下事务中语句的执行顺序 在更新语句时保持相同的更新语句的顺序

  • 相关阅读:
    看到关于java资料比较全的,自己收藏
    ie6下pnghack——css方案
    git基本操作
    购物车功能实现
    jquery学习:获取位置position(),offset(),scrollTop困惑
    Datax3.0使用说明
    Scala字符串操作
    Scala中class、object、case class、case object区别
    Scala构造函数
    scala数组操作
  • 原文地址:https://www.cnblogs.com/yxj808/p/15089184.html
Copyright © 2011-2022 走看看