【MySQL】事务知识小结

目录

一、事务基本介绍

二、数据库隔离级别

1.为什么要对数据库数据使用隔离?

2.事务并发有哪些问题:

3.通过隔离级别解决事务并发问题的方案(自上到下递减):

三、delete和truncate在事务中的区别

 


一、事务基本介绍

概念:事务由一个或多个SQL语句组成,在这个单元中,每个MySQL语句是相互依赖的。整个单元作为一个不可分割的整体,如果单元中某条SQL语句一旦执行失败或产生错误,整个单元将会回滚,所有受到影响的数据将返回到事务开始以前的状态;如果单元中所有SQL语句都执行成功,则事务被顺利执行。

基本规则:Mysql中只有Innodb 数据库引擎支持事务

                  Mysql默认以自动提交(autocommit)模式运行,若要使用事务则需开启事务:BEGIN或START TRANSACTION,提交事务:COMMIT,回滚事务:ROLLBACK

事务的ACID属性:?

事务分类

        1.隐式事务:事务没有明显的开启和结束的标记,是自动开启自动提交的。当执行一次增、删、改SQL语句就会完成事务。

        2.显式事务:事务具有明显的开启和结束的标记,适用于多条SQL语句。

                             前提:必须先设置自动提交功能为禁用

事务操作(下面1和2可以省略)

        1.首先先查看是否开启自动事务即隐式事务。

                             

        2.关闭隐式事务

         3.使用显示事务执行SQL语句

                  a.开启事务 start transaction;

                  b.编写SQL语句

                  c.结束事务

                             如果上面b中SQL语句全部执行则可以     commit(提交事务) 

                             如果上面b中SQL语句执行中发生意外     rollback(回滚事务)             

二、数据库隔离级别

1.为什么要对数据库数据使用隔离?

     对于同时运行的多个事务,当这些事务访问数据库中相同的数据时,如果没有采取必要的隔离机制,就会导致各种并发问题。

2.事务并发有哪些问题:

 1.脏读:

       其实就是读到了别的事务回滚前的脏数据。比如事务B执行过程中修改了数据X,在未提交前,事务A读取了X,而事务B却回滚了,这样事务A就形成了脏读。

也就是说,当前事务读到的数据是别的事务想要修改成为的但是没有修改成功的数据。

 2.不可重复读(针对于部分数据):

       事务A首先读取了一条数据,然后执行逻辑的时候,事务B将这条数据改变了,然后事务A再次读取的时候,发现数据不匹配了,就是所谓的不可重复读了。

也就是说,当前事务先进行了一次数据读取,然后再次读取到的数据是别的事务修改成功的数据,导致两次读取到的数据不匹配,也就照应了不可重复读的语义。
 3.幻读(针对于整张表):

       事务A首先根据条件索引得到N条数据,然后事务B改变了这N条数据之外的M条或者增添了M条符合事务A搜索条件的数据,导致事务A再次搜索发现有N+M条数据了,就产生了幻读。

也就是说,当前事务读第一次取到的数据比后来读取到数据条目少。    

这里主要再说一下不可重复度和幻读:

       不可重复度主要针对于update和delete操作,幻读针对于insert,其实对每一种事务的并发问题都有着不同的解决方案,这里把不可重复读和幻读分开就是因为这两种并发问题对应了两种的解决方案。对于不可重复度问题一般都是读取了部分数据,所以其他事务进行update和delete的时候只需要锁住读取的这部分数据,而幻读问题主要针对于读取了整张表,所以就需要锁整张表,这就是他们的不同之处。

        也就是说,解决不可重复度也就是将读取了的数据进行加锁,而解决幻读就是将整张表加锁!前者主要针对update和delete后者针对insert.

3.通过隔离级别解决事务并发问题的方案(自上到下递减):

                       查看数据库的隔离级别select @@tx_isolation;

1、Serializable (串行化):最严格的级别,事务串行执行,资源消耗最大,解决了所有问题;

2、REPEATABLE READ(重复读) :保证了一个事务不会修改已经由另一个事务读取但未提交(回滚)的数据。避免了“脏读取”和“不可重复读取”的情况,但不能避免“幻读”,但是带来了更多的性能损失。

3、READ COMMITTED (提交读):大多数主流数据库的默认事务等级,保证了一个事务不会读到另一个并行事务已修改但未提交的数据,避免了“脏读取”,但不能避免“幻读”和“不可重复读取”。该级别适用于大多数系统。

4、Read Uncommitted(未提交读) :事务中的修改,即使没有提交,其他事务也可以看得到,会导致“脏读”、“幻读”和“不可重复读取”

三、delete和truncate在事务中的区别

       我们知道delete和truncate都是用于删除数据库中的表

      下面语句分别是使用delete 和 truncate删除表

START TRANSACTION;
DELETE FROM 表名;

#先执行上面再回滚
ROLLBACK;
START TRANSACTION;
TRUNCATE FROM 表名;

#先执行上面再回滚
ROLLBACK;

      从结果可以看出delete删除的表经过rollback; 操作可以将删除的表还原

                               truncate删除的表经过rollback; 不能将删除的表还原

 

DELETE和TRUNCATE的区别:

DELETE只是删除表中的数据,不删除表,删除后的数据可以恢复。
TRUNCATE删除是把表直接DROP掉,然后再创建一个同样的新表。删除的数据不能找回。执行速度比DELETE快。

开发中通常使用DELETE。

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值