MySQL数据库事物

2019-12-24  本文已影响0人  史啸天

概述

    事物(Transaction)是数据库区别于文件系统的重要特征之一。在MySQL数据库中,有些存储引擎是不支持事物的,而主流的InnoDB存储引擎是支持事物的。事物的主要目的,事物会把数据库从一种一致状态转换为另一种一致状态;即要么所有的修改都已经保存,要么所有的修改都不保存。

事物的特性ACID

事物分类

数据异常

事物的隔离级别

SET GLOBAL TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
​SET GLOBAL TEANSACTION ISOLATION LEVEL READ COMMTTED;
SET GLOBAL TRANSACTION ISOLATION LEVEL REPEATABLE READ
SET GLOBAL TRANSACTION ISOLATION LEVEL SERIALIZABLE
隔离级别 脏读 不可重复读 幻读
读未提交(READ UNCOMMITTED)
读已提交(READ COMMITTED) ×
可重复读(REPEATABLE READ) × ×
串行化(SERIALIZABLE) × × ×

锁的类型

    InnoDB存储引擎实现了两种锁:
    1、共享锁(Shared Lock)也叫读锁,多个事物可以同时为一个对象加共享锁。
    2、排它锁(Write Lock)也叫写锁,如果一个事物对象加了排它锁,其他事物就不能再给它加任何锁了。

排他锁 共享锁
排它锁 不兼容 不兼容
共享锁 不兼容 兼容

事物的错误使用习惯

循环中提交事物

    大多数开发人员都知道不应该在循环中进行事物提交,但是有人可能不知道InnoDB存储引擎自动提交的情况。正确的做法应该是在一个循环开始前开启事物,在循环结束后,执行事物提交或者回滚。

使用自动提交

    就像上面讲到的,InnoDB存储引擎会进行隐式的自动提交,即使是一条普通的SQL语句,InnoDB存储引擎也会为它加上提交语句。我们需要做的应该是关闭自动提交,尽可能的把事物管理交给开发人员。

SET autocommit = 0;

长事物

    顾名思义,就是执行时间较长的事物。对于一些超级大的数据处理,处理时间可能长达1个小时,甚至更久;而执行事物回滚可能会比执行事物花费更多的时间。因此,对于长事物的问题,有时可以通过转化为小批量的事物来进行处理,当事物发生错误时,只需要回滚一部分数据,然后接着上次已完成的事物继续进行。

上一篇下一篇

猜你喜欢

热点阅读