美文网首页
MySQL 事务及四个特性

MySQL 事务及四个特性

作者: 攻城狮托马斯 | 来源:发表于2020-05-25 14:47 被阅读0次

    为什么需要事务?

    用户对数据库的访问是多程序多线程的,为了维护数据的一致性,我们需要事务.(间隙锁会相关) 目前只有Innodb支持事务.


    事务的四个特性

    原子性(Atomic):一个事务是一个不可分割的最小单元,要么全部执行,要么全部不执行.(增加和减少必须保持一致,转500块钱,减500,增加500,两个指令全部执行)

    一致性(Consistency):事务必须是从一个一致性的状态转移到另一个一致性的状态(转500,一方扣500,一方加500,两边数目一致)

    隔离性(Isolation):在事务正确提交之前,不允许把该事务对数据的任何改变提供给其他事务;

    持久性(Durability):事务提交后,其结果永久保存在数据库中。(就算系统崩溃也不会被改变)

    面试中隔离性被问的比较多.


    隔离性:四个隔离级别

    未提交读(read uncommited): 如果roll back导致脏读

    已提交读(read commited): 解决脏读,产生不可重复读和幻读问题

    可重复读(repeatable-read): 默认的隔离级别, 前一个事务中已经commit(把800改成750), 但本事务仍然可以重复读,获得老的值800, 除非本事务commit, 不然一直都是800. 在MySQL中解决所有问题(包括幻读),由间隙锁实现.

    可串行化(serializable): 一定能解决幻读问题,但会通过锁表来进行,当session A在读表时, session B插入或者更改任何一条记录都不会成功。

    三个问题:

    脏读: 事务A读取了事务B更新的数据,但事务B进行了回滚操作,那么A读到的就是脏数据.(隔离级别为read uncommited)

    不可重复读: 事务A多次读取同一数据, 事务B在事务A多次读取中,对数据更新并提交,导致事务A读到的数据结果不一致.(行数并没有增加, read commited, 能解决脏读问题, 但会产生不可重复读问题)

    幻读: 在同一事务下当A用户读取某一范围的数据行时,B事务在该范围内插入了新行,当A用户再读取该范围的数据行时,会发现有新的“幻影”行(即读取到了B事务插入的数据)。 即违背事务隔离性要求。

    MySQL中RR也可以解决幻读

    语法


    开启事务://三个没有区别

    Begin

    START TRANSACTION(推荐)

    behin work

    事务回滚 rollback

    事务提交 commit

    还原点 savepoint  

    相关文章

      网友评论

          本文标题:MySQL 事务及四个特性

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