• Mysql事务,并发问题,锁机制


    什么是事务(transaction)

        保证成批操作要么完全执行,要么完全不执行,维护数据的完整性。也就是要么成功要么失败。
        事务可以是n条sql语句(n>=0)
        不是所有数据库引擎支持事务,InnoDB引擎支持事务处理

    事务四大特性

        原子性(Atomic):事务的所有所有操作要么全部执行,要么全部不执行。如果中途出现错误不会停止,而是回滚到事务前的状态
        一致性(Consistency):如果事务执行前是一致的,那么执行后也是一致的,不能破坏关系数据的完整性以及业务逻辑上的一致性,事务按照预期实现。
        隔离性(Isolation):隔离性可以防止多个事务并发时导致数据的不一致
        持久性(Durability):事务执行成功后对数据库的修改是永久的

    事务并发不进行事务隔离

        脏读:事务A读到未提交事务B修改的数据,如果此时事务B中途执行失败回滚,那么此时事务A读取到的就是脏数据。比如事务A对money进行修改,此时事务B读取到事务A的更新结果,但是如果后面事务A回滚,那么事务B读取到的就是脏数据了。
        不可重复读:同一个事务中,对同一份数据读取的结果不一致。事务A在事务B对数据更新前进行读取,然后事务B更新提交,事务A再次读取,这时候两次读取的数据不同。
        幻读:同一个事务中,同一个查询多次返回的结果不一样。事务B查询表的记录数,然后事务A对表插入一条记录,接着事务B再次查询发现记录数不同。

    区别

        脏读和不可重复读:脏读是事务读取了还未提交事务的更新数据。不可重复读是同一个事务中,几次读取的数据不同。
        不可重复读和幻读的区别:都是在同一个事务中,前者是几次读取数据不同,后者是几次读取数据整体不同。

    隔离级别

    隔离级别      作用
    Serializable(串行化)        避免脏读、不可重复读、幻读
    Repeatable(可重复读)     避免脏读、不可重复读
    Read committed(读已提交)    避免脏读
    Read uncommitted(读未提交) none

    mysql支持上面4种隔离级别,默认为可重复读

    事务的使用

    start transcation;  transcation 事务开始
    delete from user;   rollback 回滚到事务起点
    savepoint dele;     savepoint 保留回滚位置
    ****
    rollback dele;    rollback point_name 回滚到设置的位置
    commit;         

    使用注意点

        如果事务中sql正确运行,后面没有commit,结果是不会更新到数据库的,所以需要手动添加commit。
        如果事务中部分sql语句出现错误,那么错误语句后面不会执行。而我们可能会认为正确操作会回滚撤销,但是实际上并没有撤销正确的操作,此时如果再无错情况下进行一次commit,之前的正确操作会生效,数据库会进行更新。

    InnoDB引擎的锁机制

    (之所以以InnoDB为主介绍锁,是因为InnoDB支持事务,支持行锁和表锁用的比较多,Myisam不支持事务,只支持表锁)
      共享锁(S):允许一个事务去读一行,阻止其他事务获得相同数据集的排他锁。
      排他锁(X):允许获得排他锁的事务更新数据,阻止其他事务取得相同数据集的共享读锁和排他写锁。
      意向共享锁(IS):事务打算给数据行加行共享锁,事务在给一个数据行加共享锁前必须先取得该表的IS锁。
      意向排他锁(IX):事务打算给数据行加行排他锁,事务在给一个数据行加排他锁前必须先取得该表的IX锁。
    说明:
      1)共享锁和排他锁都是行锁,意向锁都是表锁,应用中我们只会使用到共享锁和排他锁,意向锁是mysql内部使用的,不需要用户干预。
      2)对于UPDATE、DELETE和INSERT语句,InnoDB会自动给涉及数据集加排他锁(X);对于普通SELECT语句,InnoDB不会加任何锁,事务可以通过以下语句显示给记录集加共享锁或排他锁。
      共享锁(S):SELECT * FROM table_name WHERE ... LOCK IN SHARE MODE。
      排他锁(X):SELECT * FROM table_name WHERE ... FOR UPDATE。
      3)InnoDB行锁是通过给索引上的索引项加锁来实现的,因此InnoDB这种行锁实现特点意味着:只有通过索引条件检索数据,InnoDB才使用行级锁,否则,InnoDB将使用表锁!。

    来源:www.cnblogs.com/-new/p/7239456.html

    来源:www.cnblogs.com/fidelQuan/p/4549068.html

  • 相关阅读:
    JAVA多线程理论!
    JAVA理论!
    对于PHP的基础理论!
    C#中的ArrayList
    C#中HashTable的用法
    用C#写经理评分系统
    C#数据类型
    jQuery小测的总结
    用jQuery模拟淘宝购物车
    JavaScript--------------------jQuery中.bind() .live() .delegate() .on()的区别 和 三种方式写光棒事件 动画
  • 原文地址:https://www.cnblogs.com/aten/p/8442841.html
Copyright © 2020-2023  润新知