zoukankan      html  css  js  c++  java
  • MySQL之事务控制总结

    MySQL支持TCL(Transaction Control Language)。事务是指一条或者多条组成的SQL语句,要么全部执行要么全部不执行。

    • 事务的四大特性(ACDI):
    (1)原子性(atomicity):一个事务必须视为一个不可分割的最小工作单元,要么都执行要么都不执行。
    
    (2)一致性(consistency):一个事务执行会使数据从一个一致状态切换到另外一个一致状态。也就是说数据
     
        库要一直处于一致的状态,事务的运行不会改变数据库原本的一致性约束例如:小明和小华账户余额均为5,
    
        无论他们之间怎么转账,他们余额之和始终为10块。
    
    (3)永久性(durability)事务一旦提交,对数据的改变是永久性的。
    
    (4)隔离性(isolation):事务与事务之间互不干扰。
    
    • MySQL执行事务过程
    (1)开启事务:set autocommit=0;  start transaction(可选);
    
    (2)编写事务中的sql语句(只对select insert update delete语句有效):语句1...;语句2...;...
    
    (3)结束事务:
    
                  提交事务--commit;
    
                  回滚事务--rollback;
    
                  回滚至节点--savepoint 节点名;下面代码表示节点1之后的代码不会生效
                     SET autocommit=0;
                     START TRANSACTION;
                     DELETE FROM 表1 WHERE 条件;
                     SAVEPOINT 节点1;#设置保存点
                     DELETE FROM 表1 WHERE 条件;
                     ROLLBACK TO 节点1;#回滚到保存点   
    • 数据并发问题:一个数据库可能拥有多个访问客户端,这些客户端可能用并发的方式访问数据库,如果没有必要的隔离措施就会导致各种并发问题,破坏数据完整性。通常有以下场景:
    (1)脏读(Dirty Read):A事务读取到了B事务没有提交的数据,并在此基础进行操作。
    
    (2)幻读(Phantom):A事务读取B事务新增数据,A事务发生幻象读。
    
    (3)不可重复读(Nonrepeatable Read):A读取了B事务已经提交的更改数据,A事务两次读取同一数据,得到 
        内容不同。
    
    (4)第一类丢失更新: A事务撤销时,把已提交的B事务的更新数据覆盖了。
    
    (5)第二类丢失更新:A事务覆盖B事务已经提交的数据。
    • MySQL数据库提供的隔离级别:Read uncommitted (读未提交数据)、Read committed(读已提交数据) 、Repeatable read(可以重复读) 、Serializable(串行化,很安全,性能十分低下) 。

    查看隔离级别:select @@tx_isolation;

    设置隔离级别:set session|global transaction isolation level 隔离级别;

    事务隔离级别对并发解决情况
    隔离级别脏读幻读不可重复读第一类丢失更新第二类丢失更新
    Read uncommitted×
    Read committed××
    Repeatable read××××
    Serializable×××××
    • Delete支持事务回滚,Truncate不支持事务回滚
    只有把命运掌握在自己手中,从今天起开始努力,即使暂时看不到希望,也要相信自己。因为比你牛几倍的人,依然在努力。
  • 相关阅读:
    Linux中常用操作命令(转)
    EntityFramework 优化建议(转)
    android 腾讯x5内核 浏览器
    Android MediaMetadataRetriever 读取多媒体文件信息,元数据(MetaData)
    Android MVP 利用rxjava 避免向Model传入监听方法
    Android 单元测试(junit、mockito、robolectric)
    Android 利用RecyclerView.Adapter刷新列表中的单个view问题
    android 5.0以上通知栏、状态栏图标变成白色
    Android 照相 滤镜
    Android 进程常驻(使用第三方MarsDaemon)(虽然不可用,但是还是保留下。)
  • 原文地址:https://www.cnblogs.com/freesky168/p/14358247.html
Copyright © 2011-2022 走看看