mysql事务处理,innodb中事务的隔离级别与锁的关系

以下内容出自《高性能MySQL》第三版,了解事务的ACID及四种隔离级有助于我们更好的理解事务运作。

最近买了《高性能MySQL》这本书回来看,从中收益颇多!我来一吐为快!

mysql事物,mysql事务处理

  1. 事务并不专属于mysql

  2. 事务的ACID特性

  1)原子性(atomicity)  

  一个事务必须被视为一个不可分割的最小工作单元,整个事务中得所有操作要么全部提交成功,要么全部失败回滚,对于一个事务来讲,不可能只执行其中的一部分

      操作,这就是事务的原子性。

  2)一致性(consistency)

  数据库的总是从一个一致性的状态转换到另一个一致性的状态。

  3)隔离性(isolation)

  通常来说,一个事务所做的修改在最终提交之前,对其他事务是不可见的。

  4)持久性(durability)

  一旦事务提交,则其所做的修改就会永久保存到数据库中。

  1. 隔离级别

  1)READ UNCOMMITTED(未提交读)

    在该级别,事务中得修改,即使没提交,对其他事务也是可见的。

兴發国际娱乐手机登录,  2)READ COMMITTED(提交读)

    在提交之前对其他事务都是不可见的

  3)REPEATABLE READ(可重复读)[mysql默认的事务隔离级别]

    该级别保证了在同一个事务中多次读取同样的记录的结果是一致的。

    但是会产生幻读得问题

  4)SERIALIZABLE(可串行化)

    该级别会在读取的每一行数据上都加锁

 

隔离级别 脏读可能性 不可重复读可能性 幻读可能性 加锁读
READ UNCOMMITED Yes Yes Yes No
READ COMMITTED No Yes Yes No
REPEATABLE READ No No Yes No
SERIALIZABLE No No No Yes

 

1. 事务并不专属于mysql

  1. 事务的ACID特性 1)原子性(atomicity)
    一个事务必须被视为一个不可分割的最小工作单元,整…

下面举一个银行应用是解释事务必要性的一个经典例子。假如一个银行的数据库有两张表:支票表(checking)和储蓄表(savings)。现在要从用户Jane的支票账户转移200美元到她的储蓄账户,那么至少需要三个步骤:

我们都知道事务,那么在什么情况下我们需要使用事务呢?

1、检查支票账户的余额高于或者等于200美元。

银行应用是解释事务的一个经典例子。假设一个银行的数据库有两张表:支票(checking)和储蓄(savings)表。现在johnson要从支票账户中转移200块大洋到储蓄表中,那么至少需要三个步骤:

2、从支票账户余额中减去200美元。

  1. 检查支票账户余额是否高于200块大洋
  2. 支票账户减少200块大洋
  3. 储蓄账户中增加200块大洋

3、在储蓄帐户余额中增加200美元。

试想一下,如果上面步骤执行到第二步,突然因为什么原因而终止了,顾客支票账户中莫名其妙的减少了200块大洋。如果顾客恰好是一位情绪激动的大妈,那你就等着大妈带着平底锅和四级头去银行找你吧!

上述三个步骤的操作必须打包在一个事务中,任何一个步骤失败,则必须回滚所有的步骤。

所以为了避免这种情况,就必须用到事务,上述三个步骤中有任何一个执行失败,就必须回滚所有的步骤,以免有大妈找上门。事务SQL如下所示:

 

  1. START TRANSACTION;
  2. SELECT balance FROM checking WHERE customer_id=123456;
  3. UPDATE checking SET balance = balance – 200 WHERE
    customer_id=123456;
  4. UPDATE savings SET balance = balance + 200 WHERE
    customer_id=123456;
  5. COMMIT;

可以用START
TRANSACTION语句开始一个事务,然后要么使用COMMIT提交将修改的数据持久保存,要么使用ROLLBACK撤销所有的修改。事务SQL的样本如下:

事务之所以可靠,当然离不开ACID特性:

  1. start transaction;

  2. select balance from checking where customer_id = 10233276;

  3. update checking set balance = balance – 200.00 where customer_id =
    10233276;

  4. update savings set balance = balance + 200.00 where customer_id =
    10233276;

  5. commit;

  • 原子性(atomicity):整个事务中的操作要么全部成功,要么全部失败。
  • 一致性(consistency):数据库总是从一个一致性状态转换到另一个一致性状态。比如上面所说的,事务开始前和执行后,顾客johnson在银行的总账户余额是一样的。
  • 隔离性(isolation):通常来说,一个事务所做的修改在提交之前,其他事务是不可见的。也就是说事务间是相互隔离的。
  • 持久性(durability):事务在提交之后,对数据库数据所做的修改是永久性的。

 

细心的人可能会注意到。在讨论隔离性的时候,我用了“通常来说”,下面就让我们讨论下事务的隔离级别。

ACID表示原子性(atomicity)、一致性(consistency)、隔离性(isolation)和持久性(durability)。一个很好的事务处理系统,必须具备这些标准特性:

隔离级别 脏读可能性 不可重复读可能性 幻读可能性 加锁读
READ UNCOMMITTED YES YES YES NO
READ COMMITTED NO YES YES NO
REPEATABLE READ NO NO YES NO
SERIALIZABLE NO NO NO YES

 

 

发表评论

电子邮件地址不会被公开。 必填项已用*标注