美文网首页
mysql事务基础

mysql事务基础

作者: 遇酒无缘 | 来源:发表于2019-04-04 16:06 被阅读0次

事务

多条sql语句做为一个整体来进行操作的功能,被称为数据库事务
特点:事务内所有sql语句的执行要么都成功,要么都失败

1.事务提交

BEGIN;
  UPDATE accounts SET balance = balance - 100 WHERE id = 1;
  UPDATE accounts SET balance = balance + 100 WHERE id = 2;
COMMIT;

2.事务回滚

BEGIN;
UPDATE accounts SET balance = balance - 100 WHERE id = 1;
UPDATE accounts SET balance = balance + 100 WHERE id = 2;
ROLLBACK;

3.事务隔离

对于两个并发执行的事务,如果涉及到操作同一条记录的时候,可能会发生数据问题。因为并发操作会带来数据的不一致性,包括脏读、不可重复读、幻读等。数据库系统提供了隔离级别来让我们有针对性地选择事务的隔离级别,避免数据不一致的问题。
SQL标准定义了4种隔离级别,分别对应可能出现的数据不一致的情况:

Isolation Leve 脏读
(Dirty Read)
不可重复读
(Non Repeatable Read)
幻读
(Phantom Read)
Read Uncommitted Yes Yes Yes
Read Committed - Yes Yes
Repeatable Read - Yes -
Serializable - - -
1).Read Uncommitted

Read Uncommitted是隔离级别最低的一种事务级别。在这种隔离级别下,可能会遇到读取脏数据的问题

一个事务会读到另一个事务更新后但未提交的数据,如果另一个事务回滚,那么当前事务读到的数据就是脏数据,这就是脏读(Dirty Read)

看个例子:

mysql> select * from students;
+----+-------+
| id | name  |
+----+-------+
|  1 | Alice |
+----+-------+
1 row in set (0.00 sec)
时刻  事务A                                               事务B
1   SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;   SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
2   BEGIN;                                              BEGIN;
3   UPDATE students SET name = 'Bob' WHERE id = 1;  
4                                                       SELECT * FROM students WHERE id = 1;
5   ROLLBACK;   
6                                                       SELECT * FROM students WHERE id = 1;
7                                                       COMMIT;

事务B第一条查询语句的结果name为Blob,第二条查询语句的结果name为Alice,由于读到脏数据造成前后数据不一致。

2).Read Committed

Read Committed隔离级别下,一个事务可能会遇到不可重复读(Non Repeatable Read)的问题。

不可重复读是指,在一个事务内,多次读同一数据,在这个事务还没有结束时,如果另一个事务恰好修改了这个数据,那么,在第一个事务中,两次读取的数据可能不一致

时刻  事务A                                               事务B
1   SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;   SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
2   BEGIN;                                              BEGIN;
3                                                       SELECT * FROM students WHERE id = 1;
4   UPDATE students SET name = 'Bob' WHERE id = 1;                                                      
5   COMMIT; 
6                                                       SELECT * FROM students WHERE id = 1;
7                                                       COMMIT;

事务B第一条查询语句的结果name为Alice,第二条查询语句的结果name为Bob
Committed隔离级别下,事务不可重复读同一条记录,因为很可能读到的结果不一致

3).Repeatable Read

Repeatable Read隔离级别下,一个事务可能会遇到幻读(Phantom Read)的问题。

幻读是指,在一个事务中,第一次查询某条记录,发现没有,但是,当试图更新这条不存在的记录时,竟然能成功,并且,再次读取同一条记录,它就神奇地出现了。

时刻  事务A                                               事务B
1   SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;    SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;
2   BEGIN;                                              BEGIN;
3                                                       SELECT * FROM students WHERE id = 99;
4   INSERT INTO students (id, name) VALUES (99, 'Bob'); 
5   COMMIT; 
6                                                       SELECT * FROM students WHERE id = 99;
7                                                       UPDATE students SET name = 'Alice' WHERE id = 99;
8                                                       SELECT * FROM students WHERE id = 99;
9                                                       COMMIT;

事务B第一条、第二条查询语句的结果empty,第三条查询语句的结果name为更新后的Alice
幻读就是没有读到的记录,以为不存在,但其实是可以更新成功的,并且,更新成功后,再次读取,就出现了。

4).Serializable

Serializable是最严格的隔离级别。在Serializable隔离级别下,所有事务按照次序依次执行,因此,脏读、不可重复读、幻读都不会出现。

虽然Serializable隔离级别下的事务具有最高的安全性,但是,由于事务是串行执行,所以效率会大大下降,应用程序的性能会急剧降低。如果没有特别重要的情景,一般都不会使用Serializable隔离级别。

5).默认隔离级别

如果没有指定隔离级别,数据库就会使用默认的隔离级别。在MySQL中,如果使用InnoDB,默认的隔离级别是Repeatable Read

参照: 廖雪峰mysql教程

相关文章

  • MySQL基础——事务

    上篇文章学习了MySQL基础——多表查询,这篇文章学习MySQL基础——事务。 事务 事务是一组操作的集合,它是一...

  • 谈谈Transaction——MySQL事务处理分析

    MySQL 事务基础概念/Definition of Transaction 事务(Transaction)是访问...

  • MySQL优化之事务基础,实战优化的基础知识

    MySQL的逻辑架构 MySQL主键自增机制 MySQL关键词 什么是事务 MySQL 创建事务的基础语法 一组事...

  • 10-事务

    事务基础 什么是事务MySQL 中的事务主要用于处理操作量大,复杂度高的数据。MySQL 中只有使用了 Innod...

  • MYSQL(一)---基础架构(查询)

    1.MYSQL(一)---基础架构(查询)2.MYSQL(二)---日志系统(更新)3.MYSQL(三)---事务...

  • MYSQL(二)---日志系统(更新)

    1.MYSQL(一)---基础架构(查询)2.MYSQL(二)---日志系统(更新)3.MYSQL(三)---事务...

  • MYSQL(三)---事务隔离

    1.MYSQL(一)---基础架构(查询)2.MYSQL(二)---日志系统(更新)3.MYSQL(三)---事务...

  • Mysql基础——事务

    内容 事务事务基本知识事务特性如何实现的?快照读和当前读 分布式事务XA规范mysql基于XA实现的分布式事务my...

  • mysql事务基础

    事务 多条sql语句做为一个整体来进行操作的功能,被称为数据库事务特点:事务内所有sql语句的执行要么都成功,要么...

  • mysql事务基础

    转载自:https://www.cnblogs.com/huanongying/p/7021555.html本文实...

网友评论

      本文标题:mysql事务基础

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