MySql中rollback事务回滚作用是什么?

学习MySql时学习到rollback事务回滚,视频讲innoDB存储引擎:提供一组用来记录事务性活动的日志文件,在事务的执行过程中,每一条DML操作都会记录到"事务性活动的日志文件"中,在事务执行过程中,可以提交或回滚事务。
提交事务:清空事务性活动的日志文件,将数据全部持久化到数据库表中。
回滚事务:将之前的DML操作撤销,并清空事务性活动的日志文件。
产生一个疑问,写代码时,当执行事务中DML语句失败,出现SQLException时候,进入catch语句块,进行conn.rollback事务回滚,清空事务性活动的日志文件,请问这个操作有什么意义?如果不进行回滚有什么影响吗?是不进行回滚的话,DML操作会一直在保存日志中,导致下面执行别的语句提交后,也会执行之前没有回滚的语句吗???

假如有这样一个操作:
从A用户的账户扣除100元,添加到B用户的账户里去
如果A用户扣费正常,而B用户添加不正常,如果不回滚,那不是凭空少了100元?
当然这只是一个简单的例子,实际项目中,有大量必须保持一致的数据,要成功必须一起成功,要么就恢复原样

实际就是为了保证整个流程数据的一致性,比如你转账给张三1000元,由两步构成1、你的账户减少1000,2、张三的账户多出1000元,那么整体流程可能出现三种情况
一、你的账户在减少1000的时候就失败,那结果就是你账户没减少,张三账户没增加。
二、你账户减少1000元成功,再给张三增加1000元的时候失败了,那结果就是你减少1000,张三账户没增加。
三、整个流程都成功,那结果就是你减少1000,张三账户增加1000。
由此可见在第二种情况的时候数据就不一致了,你减少了1000,而张三没增加1000,这个时候加个事务,要么就是步骤一,整个流程失败,要么就是步骤三,整体流程成功,一般加不加事务取决于你现实的业务场景。至于不加事务的话系统默认是回滚到哪一步可能跟你的代码有关,可能跟你使用的框架技术有关

回滚是保证事务的一致性。
其实单这样说事务日志文件在DML提交或者回滚后,直接清空是不严谨的,undo log 也分 insert undo log 和update undo log 删除操作都是由purge来操作,但是因为update和delete的undo log会用于MVCC 所以回滚不会立即删除日志。

  • 这篇文章讲的很详细,请看:mysql 事务 rollback失效 回滚无效
  • 除此之外, 这篇博客: MySQL的rollback--大事务回滚中的 事务回滚 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 事务是关系型数据库里的执行单位,可以通过最后阶段控制选择提交或回滚。在各种无法保证完整性的场景下进行回滚操作。MySQL里回滚是通过Undo日志完成,Undo日志记录包含关于如何撤消事务相关的最新更改的信息。Undo日志存在于Undo日志段中,Undo日志段包含在回滚段中。回滚段位于undo表空间和全局Temporary表空间中。
    关系如下:

    image.png

    • undo文件

      image.png

    mysql > show variables like '%undo%';
    +--------------------------+--------------------+
    | Variable_name            | Value              |
    +--------------------------+--------------------+
    | innodb_max_undo_log_size | 1073741824         |
    | innodb_undo_directory    | /opt/data8.0/mysql |
    | innodb_undo_log_encrypt  | OFF                |
    | innodb_undo_log_truncate | ON                 |
    | innodb_undo_tablespaces  | 2                  |
    +--------------------------+--------------------+
    5 rows in set (0.00 sec)

    全局Temporary所指的一个临时表空间(ibtmp1),用于存储对用户创建的临时表所做更改的回滚段。
     

    image.png

     

    mysql > SELECT @@innodb_temp_data_file_path;
    +-------------------------------+
    | @@innodb_temp_data_file_path  |
    +-------------------------------+
    | ibtmp1:128M:autoextend:max:30G |
    +-------------------------------+

    理解了回滚包含的文件都有那些 ,继续往下看。