您的位置:首页 > 数据库

SQL事务以及 白话解释事务隔离级别

2020-06-29 05:03 1106 查看

复习直接看总结

前言

事务-----Transcation   我们让数据库做的事情

SQL语句是我们给数据库发送了指令,让数据库帮我们做事

1,事务可以理解为让数据库做的事情

2,有的时候事情之内不止一条sql 存在多个组成单元

      比如在转账的时候 A要少一百 B要多一百

 3,转账这件事,所有的操作都是得统一的

    要么全成功 要么全失败

4,事务本质

     就是多线程并发操作同一张表格可能带来的安全问题

-----------------------------------------------------------------------------------------

概念:事务的四大特性(ACID)

A:Atomicity------>原子性

         一个事务之中的所有操作是一个整体,不可再分

         事务里的所有操作要么成功,要么失败

C:Consistency------>一致性

         一个用户操作了数据,提交了之后

         另一个用户看到的数据与之前用户看到的效果是一致的

**I:Isolation------->隔离性------>事务隔离级别(四个)

         多个用户并发的访问数据库时

         一个用户操作数据库,另一个用户不能有所干扰

          多个用户之间的数据事务操作要互相隔离

D:Durability----->持久性

         指的是一个用户操作数据的事务一旦被提交(意思是缓存写入文件)

         他对数据库底层真实的改变是永久的(不可返回的)

-------------------------------------------------------------------------------

事务的过程:

mysql数据库事务默认的效果可以更改

autocommit 变量 = on;

show variables like '%commit% ';查询commit的状态

show variables like 'autocommit';查询commit的状态

0.1  set  autocommit  = off; 设置自动提交  关闭

1,开启一个事务

     每次执行一个SQL语句之前 MySQL会默认的开启(可以变成手动)

     begin;   或者  1.1  start transaction;(手动开启事务)

2,执行操作

    可能不知一个语句

  2.1  做一些新增等。。

3,事务的处理

    提交/回滚/保存还原点

    3.1  rollback;(0.1-3.1执行完毕后,由于你关闭的自动提交事务并且还手动开启了事务,

但是在最后你没有手动的提交事务,所以回滚之后2.1的新增等的操作会被取消)

     MySQL数据库会默认执行提交的事务;

手动提交commit;

--------------------------------------隔离性--------------------------------------------

事物的隔离性 会产生多线程并发操作同一个数据库表格的问题

  会带来数据的安全隐患 

可能出现的问题:

1,脏读(4)

     一个人读到了另一个人还没有提交的数据 

     AB同时操作一张表格

     A修改了数据,没有提交,B读取到了

     A又不提交,回滚了,B刚刚读到的那些数据就是无用的-----脏数据

2,不可重复读------注重修改/删除

AB同时操作一张表格

A先读取了一些数据,读完之后B此时吧数据做了修改/删除

A再次按照之前的条件重新读取一遍,和第一次读取的内容不一样

3,幻读(虚读)注重新增

AB同时操作一张表格

A先读取了一些数据,读完之后B此时吧数据做了新增

A再次按照之前的条件重新读取一遍,和第一次读取的数量不一样

 

--------------------------------------------  事务的隔离级别-------------------------------------------------

Serializable                 最高  避免所有的出现的问题  性能慢

Repeatable Read       可以重复读(避免脏读,不可重复读)

出现以下情况:

A开启了一个事务,此时,B开始了一个事务并查询数据,然后

A更改一个数据,B再次查询数据,B会发现数据不一样;

可以开启Repeatable Read避免此处情况

注意:

开启了事务之后,只会避免B再开启一个事务未结束的时候:读取的数据不会改变,但是实际的数据可能已经被A更改了;

关闭B的事务再次读取才会读取到A更改的东西

Read Committed         读已提交(避免脏读)

出现以下情况:

A开启事务 未提交事务,B 读取到了还未提交的数据;

可以开启Read Committed 避免此处情况

Read UnCommitted    读取未提交()

这个事务是最基础的,所以只有对应的特点:

A开启事务 未提交,被B 读取到了未被提交的数据;

----------------------------------------------默认隔离级别-------------------------------------------------------------

MySQL 默认隔离级别是Repeatable Read

Oracle  默认的是Read Committed

-------------------------------------修改数据库的隔离级别------------------------------------------------

set session transaction isolation level xxxxx;

查询数据库的隔离级别;

select @@ tx_isolation;

 

 

=============================总结================================

1,事务是数据库进行的操作,事务先

              开启-------修改----(可以回滚,回滚到开启事务的时候)---------提交

              begin------操作-----rollback---------------------------------------------commit

2,在事务开启的时候,出现问题   脏读-------重复读------幻读,

3,出现问题怎么办   有个事务隔离级别 1  2  3  4  四个级别

四个级别可以解决上面出现的问题

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐