MySQL事务

1、事务的概念

现实生活中,会遇到转账的情况。转账可分为两部分:转入和转出。若转入和转出其中的任意一部分出现异常无法完成转入或转出,就无法完成交易。

为了防止以上情况的发生,MySQL引入了事务(Transaction)。事务是针对数据库的一组操作,它可以有一条或多条SQL语句组成。

2、事务的操作

①开启事务

START TRANSACTION;
SELECT * FROM user

若要使用MySQL,那么在使用SQL语句之前需要先启动事务。

②提交事务

START TRANSACTION;
SELECT * FROM user
COMMIT;

使用了SQL语句之后,最后需要提交事务。

③回滚事务

START TRANSACTION;
INSERT INTO user VALUES("zhangsan", "男", 24)
ROLLBACK;

若在执行事务的过程中遇到了突发情况,突然不想提交事务,就可以将事务回滚。事务回滚后,该事务中的所有修改、增加等涉及对数据库信息修改的SQL语句都是无效的。

3、事务的特性(ACID)

①原子性(Atomicity)

可以这样解释原子性:“事务中的SQL语句,若不出现异常,都顺利执行;若出现异常,就全部失效,都不执行”。原子性是指一个事务必须视为一个不可分割的最小工作单元。

②一致性(Consistensy)

一致性是指事务将数据库从一种状态转变为另一种一致的状态。例如:在表中有一个字段为id,id为主键,不可重复。若一个事务将某条数据的id值修改了,值不唯一,这就违背了事务的一致性,这一个事务将得不到成功执行,MySQL数据库系统会自动撤销这一违背事务一致性的事务。

③隔离性(Isolation)

例子:当多个用户并发访问数据库时,数据库为每一个用户开启的事务,不能被其他事务操作所影响,多个并发事务之间相互隔离。

④持久性(Durability)

事务一旦提交,事务中涉及对数据库中数据修改的内容将永久生效,将维持持久性。注意,这里的“永久”是相对的,若因其他外部原因导致数据库损坏(如:硬盘被炸毁),“永久”的数据可能会丢失。

4、事务的隔离级别

首先介绍一下多个事务并发操作时可能会产生的几种状况。

  1. 脏读

    一个事务的数据读取了另一个事务的未提交(UNCOMMITED)数据。举个例子:账户A开启一个事务,账户B开启一个事务。账户A向账户B转款100元,但是,账户A未提交。与此同时,账户B查询到数据库中,自己多了100元,以为自己已经得到了账户A的100元转账(这是账户B未提交的数据),于是账户B确认。但是账户A将事务进行ROLLBACK回滚,当账户B再次登录数据库查询自己的余额时,发现余额并没有实际增加。这就是脏读。

  2. 不可重复读(NON-REPEATABLE READ)

    不可重复读是指事务中两次查询的结果不一致,原因是在查询的过程中其他事务做了更新的操作。

  3. 幻读(PHANTOM READ)

    幻读与不可重复读相似,幻读是指事务中两次查询的结果的条目数不一致,原因是在查询的过程中其他事务做了插入或删除条目的操作。

①读-未提交(READ UNCOMMITED)

读-未提交是MySQL事务中的最低隔离级别,即一个事务可以访问另一个事务未提交的修改操作后的数据,这被称为脏读(Dirty Read),这是很不符合实际的应用的需要的,数据的安全性、稳定极低。绝大多数情况下,MySQL数据库都不会采用这种隔离级别。

②读-提交(READ COMMITED)

大多数数据库都是默认使用READ COMMITED隔离级别的,例如Oracle。读-提交使得一个事务可以访问另一个事务已经提交的修改后数据。读-提交隔离界别会产生不可重复读(NON-REPEATABLE READ)幻读(PHANTOM READ)情况。

③可重复读(REPEATABLE READ)

可重复读是MySQL数据库的默认的隔离级别,即两个事务的并发操作互不相干,一个事务提交修改的数据后,另一个事务并不会因此改变原有查询到的数据的信息。可重复读这一隔离级别能够有效避免脏读(Dirty Read)、不可重复读(NON-REPEATABLE READ)、幻读(PHANTOM READ)情况。

④可串行化(SERIALIZABLE)

可串行化是事务的最高隔离级别。这种隔离界别会对所有事务进行强制排序,形成一个队列,排队进行操作。可串行化保证了数据修改过程的事务对象的绝对唯一,完全避免了脏读(Dirty Read)、不可重复读(NON-REPEATABLE READ)、幻读的情况。可串行化隔离级别会严重影响数据库的性能,在实际中很少使用。

posted @ 2017-02-24 22:13  晚樨  阅读(128)  评论(0编辑  收藏  举报