MySQL事务的四个特征及其隔离级别

1、事务概念

在MySQL中,事务其实就是一个最小的不可分割的工作单元,事务可以保证一个业务的完整性,也就是说要么全部成功,要么全部失败。

2、事务使用

  • 在MySQL中,默认是开启事务的(自动提交)
    在这里插入图片描述

  • 默认开启事务的作用是什么??

    当我们去执行一个sql语句的时候,效果会立即体现出来,且不能回滚(rollback)

    举个例子:
    在这里插入图片描述

  • 事务回滚(rollback):撤销sql语句执行的效果

  • 设置mysql自动提交为false
    在这里插入图片描述
    当将设置mysql自动提交为false,我们再进行插入数据,我们发现可以使用回滚(roolback),数据返回到之前的一个状态
    在这里插入图片描述
    但是当我们进行手动提交(commit)之后,再进行(rollback),数据是不会返回到之前的一个状态

    在这里插入图片描述

总结:

  • 手动开启事务:事务开启之后,一旦commit提交,就不可以回滚(也就是说当前的这个事务在提交的时候就结束了)

    1、修改默认提交 set autocommit=0;
    2、begin;
    3、start transaction;

  • 事务提交:commit

  • 事务手动回滚:rollback

3、事务的四大特征(ACID)

3.1 原子性(atomicity)

事务是最小的单位,不可以分割

3.2 一致性(Consistency)

事务要求,同一事务中的 SQL 语句,必须同时成功或者失败

3.3 隔离性(Isolation)

事务a与事务b之间具有隔离性

  • 查看数据库的隔离级别

    -- 系统级别
    select @@global.transaction_isolation;
    -- 会话级别
    select @@transaction_isolation;
    -- mysql 默认级别 REPEATABLE-READ 
    

    在这里插入图片描述

3.3.1 read uncommitted(读未提交的);
  • 修改隔离级别?

    set global transaction isolation level read uncommitted;
    
    mysql> set global transaction isolation level read uncommitted;
    Query OK, 0 rows affected (0.00 sec)
    
    mysql> select @@global.transaction_isolation;
    +--------------------------------+
    | @@global.transaction_isolation |
    +--------------------------------+
    | READ-UNCOMMITTED               |
    +--------------------------------+
    
  • 如果有事务a,和事务b,a事务对数据进行操作,在操作的过程中,事务没有被提交,但是b可以看见a的操作的结果
    例如转账: 小明(事务a),淘宝(事务b)

    在这里插入图片描述
    这种隔离级别就会产生脏读的问题(可以试着自己操作)

    – 如果两个不同的地方,都在进行操作,如果事务a开启,他的数据可以被其他事务读取到
    – 这样就会出现(脏读)
    – 脏读:一个数据读到了另一个事务没有提交的数据,就叫做脏读

3.3.2 read committed(读已提交的);
set global transaction isolation level read committed;
select @@global.transaction_isolation;
mysql> set global transaction isolation level read committed;
Query OK, 0 rows affected (0.00 sec)

mysql> select @@global.transaction_isolation;
+--------------------------------+
| @@global.transaction_isolation |
+--------------------------------+
| READ-COMMITTED                 |
+--------------------------------+
1 row in set (0.00 sec)

举个例子:
在这里插入图片描述
总结:

– 虽然我只能读到另一个事务提交的数据,但还是会出问题,就是读取同一个表中的数据,发现前后不一致 (例如:小张读到数据前后不一致)
– 不可重复的现象

3.3.3 repeatable read(可以重复化);
  • 修改隔离级别

    set global transaction isolation level repeatable read;
    select @@global.transaction_isolation;
    

    在这里插入图片描述
    总结

    – 这种现象就叫做幻读
    – 事务a操作和事务b同时操作一张表,事务a提交的数据,也不能被事务b读到,就会造 成幻读

3.3.4 serializable(串行化);
  • 修改隔离级别

    
    set global transaction isolation level serializable;
    
    select @@global.transaction_isolation;
    

    在这里插入图片描述
    总结:

    – 串行化的问题是,性能特别差

– 串行化的问题是,性能特别差
– 隔离级别越高,性能越差,所以默认的隔离级别是 repeatable read

read uncommitted  >  read committed > repeatable read > serializable
3.4 持久性(Durability)

事务一旦结束(commit,rollback),就不可以返回

发布了50 篇原创文章 · 获赞 19 · 访问量 4669

猜你喜欢

转载自blog.csdn.net/qq_44723296/article/details/104649160