MySQL(七)


事务管理


事务就是一组DML语句组成,这些语句在逻辑上存在相关性,要么全部失败,要么全部成功,即就是一个整体。MySQL提供一种机制,保证达到我们想要的效果,并且事务还规定不同的客户端看到的数据是不相同的。
事务的基本操作
直接看例子。创建测试表

mysql> create table account(
    -> id int primary key,
    -> name varchar(32) not null,
    -> balance decimal(10,2) not null);
Query OK, 0 rows affected (0.03 sec)

开始一个事务

start transaction;

创建一个保存点

savepoint 保存点名;

回到保存点

rollback to 保存点名;

上述为例,看代码:
开启事务

mysql> start transaction;
Query OK, 0 rows affected (0.00 sec)

设置保存点

mysql> savepoint aa;
Query OK, 0 rows affected (0.00 sec)

添加一条记录

mysql> insert into account values(1,'张三',10);
Query OK, 1 row affected (0.01 sec)

设置保存点

mysql> savepoint bb;
Query OK, 0 rows affected (0.00 sec)

在添加一条记录

mysql> insert into account values(2,'李四',10000);
Query OK, 1 row affected (0.00 sec)

查看

mysql> select * from account;
+----+------+----------+
| id | name | balance  |
+----+------+----------+
|  1 | 张三 |    10.00 |
|  2 | 李四 | 10000.00 |
+----+------+----------+
2 rows in set (0.00 sec)

此时发现第二条记录错误,回滚

mysql> rollback to bb;
Query OK, 0 rows affected (0.00 sec)

查看

mysql> select * from account;
+----+------+---------+
| id | name | balance |
+----+------+---------+
|  1 | 张三 |   10.00 |
+----+------+---------+
1 row in set (0.00 sec)

若发现全部错误,则回滚到开启事务。
事务操作注意事项
(1)如果没有设置保存点,也可以回滚,只能回滚到事务的开始。(rollback回滚,但是前提是还没有提交);
(2)如果一个事务被提交了(commit),则不可以回滚;
(3)可以选择回滚到哪个保存点;
(4)InnoDB支持事务,MySIAM不支持事务。

事务的隔离级别
当我们有多个客户端同时操作数据库的某张表时,是需要隔离的。MySQL提供了隔离级别,可以让不同的事务在操作数据时,具有隔离性,从而保证数据的一致性。
(1)无隔离性问题
%脏读:是指当一个事务正在访问数据时,并且对数据进行了修改,而这种修改还没有提交到数据库中,这是,另外一个事务也访问了这个数据,然后使用了该数据。通俗来讲,就是看到了不该看到的数据。
%不可重复读:是指在一个事务内,多次读同一数据。在这个事务还没有结束时,另外一个事务也访问该数据,则在第一个事务中的两次读数据之间,由于第二个事务的修改,导致第一个事务两次读到的数据可能不一样,这样就发生了一个事务内两次读到的数据不相同,因此称为是不可重复读。
%幻读:是指当事务不是独立执行时发生的现象。如第一个事务对数据进行了修改,这种修改涉及到表中所有的数据行,同时,第二个事务也修改这个表中的数据,这种修改是向表中插入一行新数据,则以后就会发生操作第一个事务的用户发现表中还有没有修改的数据行,好像发生了幻觉一样。
注意
不可重复读的重点是修改,同样的条件,你读取过的数据再次读就是不一样的值;而幻读重点在新增或是删除,同样的条件,第一次和第二次读出来的记录数不一样。
(2)隔离级别:读未提交(read uncommitted)、读已提交(read committed)、可重复读(repeatable read)、可串行化(serializable). MySQL默认的隔离级别是可重复读,一般情况下不要修改。
设置事务的隔离级别

mysql> set session transaction isolation level read uncommitted;
Query OK, 0 rows affected (0.00 sec)

查看当前的隔离级别

mysql> select @@tx_isolation;
+------------------+
| @@tx_isolation   |
+------------------+
| READ-UNCOMMITTED |
+------------------+
1 row in set, 1 warning (0.00 sec)

事务的ACID特性
(1)原子性(Atomicity)
是指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。
(2)一致性(Consistency)
一个事务可以封装状态改变(除非它是只读的),事务必须始终保持系统处于一致的状态,不管在任何给定的时间并发事务有多少。
(3)隔离性(Isolation)
是指多个用户并发访问数据库时,数据库为每一个用户开启的事务,不能被其他事务的操作数据所干扰,多个并发事务之间要相互隔离。
(4)持久性(Durability)
是指一个事务一旦被提交,它对数据库的数据的修改就是永久性的,接下来即使数据库发生故障也不应该对其有任何的影响。

你可能感兴趣的:(MySQL(七))