• 数据库——事务


    MySQL事务

    MySQL事务机制主要用于处理操作量大、复杂度高的数据

    ·在MySQL中只有使用了Innodb数据库引擎的数据表和数据库才支持事务

    ·事务处理可以用来维护数据的完整性,保证多条SQL语句要么全部执行,要么全部不执行

    ·事务用于管理insertupdatedelete之类的DML语句,[select语句],其它类型的SQL语句没有事务的概念

    概述事务

            事务必须满足ACID4个条件:A原子性、C一致性、I隔离性、D持久性

    原子性:一个事务中的所有操作要么全部完成、要不一个都不做,不会结束在中间某个环节

    一致性:事务执行结束后数据库的完整性没有破坏

    隔离性:数据库允许多个并发事务对数据库中的数据进行读写操作,隔离性可以防止多个事务并发 执行时导致的数据不一致性。事务根据隔离等级可以分为4级:读未提交、读已提交、可重复读和串行化

    持久性:事务执行完成后对数据的修改就是永久的

    事务与数据库底层数据

    事务的进行过程中,在未结束之前,DML语句并不会直接更改底层数据,只是将历史操作记录一下,在内存中完成记录。只有在事务结束时,而且应该是成功结束时,才会修改底层硬盘文件中的数据

    事务的原子性是通过undo log来实现

    事务的持久性是通过redo log来实现

    事务的隔离性是通过【读写锁+MVCC多版本并发控制】来实现的

    事务的一致性是通过原子性、持久性和隔离性来实现的

    事务控制语句

    begin或者 start transaction可以显式的开启一个事务,结束事务有提交和回滚2种方式

    commit提交事务,并使已执行的对数据库的所有修改成为永久性修改

    rollback回滚结束事务,撤销已经执行的未提交的修改操作

    savepoint 标识名称 用于在事务过程种创建一个保存点,从而支持部分回滚。一个事务中可以添加多个保存点

    release savepoint 标识名 用于删除一个事务的保存点,如果对应名称的保存时不存在则抛出异常

    rollback to 标识名 将事务回滚到指定的保存点,执行名称的保存点到当前位置的所有操作撤销,但是保存点之前的操作仍旧保留,等待事务结束

    set transaction isolation level用于设置事务的隔离性,innodb存储引擎提供的隔离性有读未提交

    read uncommitted、读已提交read committed、可重复读repeatable readserializable串行化,系统默认隔离等级为可重复读

    事务处理

    begin开启事务 rollback事务回滚 commit事务提交

    还可以使用set改变MySQL的自动提交模式

    set autocommit=0 禁止自动提交

    set autocommit=1 开启自动提交

    隔离级别

    数据库重要的功能就是实现数据共享,对于同时运行的多个事务,当多个事务同时访问数据库中相同的数据时,如果没有采取必要的隔离机制,则会导致出现各种并发问题。

    常见问题

    1、第一类丢失更新:A事务回滚时把已经提交的B事务更新的数据覆盖了。解决方案是锁机制

    2、脏读:A事务读取到B事务更新但是还没有提供的数据,如果B回滚撤销,则A读取的数据就是临时而且无效的数据。

    3、不可重复读:A事务读取到了一个字段值,但是B更新并提交了该字段的修改,A再次读取同一个字段值,但是两次读取到的内容不一致

    4、幻读:A事务从一个表中读取了多行数据,但是B事务插入或者删除了一些新的行,如果A再次读取,则发现数据会有多出来或者少掉的行

    5、第二类丢失更新:A事务修改记录,同时B事务修改记录,B提交数据后使用B的修改结果覆盖了事务A的修改结果

    总结隔离等级

    隔离级别
    描述
    Read-Uncommitted
    允许事务读取其它事务没有提交的数据,脏读、不可重复读和幻读问题都会出现
    Read -Committed
    只允许事务读取其它事务已经提交的数据,可以避免脏读,但是不可重复读和幻读问题都会出现
    Repeatable-Read
    可以保证多次从一个字段中读取相同的数据,可以认为事务开启时会自动对现有数据进行快照,其它事务修改不管是否提交,当前事务读取的时快照数据, 可以避免脏读和不可重复读,但是幻读问题会出现。快照是 MVCC 多版本并发控制
    Serializable
    可以确保事务是串行执行,可以避免所有的并发问题,但是由于性能低下,一般不使用

    读未提交

    MySQL数据库中事务的隔离实际上是依靠锁机制来实现的,但是加锁会带来性能的损失。读未提交隔离等级是不加锁的,所以性能最好,但是由于基本没有什么限制,所以脏读问题都无法解决。

    读已提交

    解决脏读问题的方法就是只允许读取别的事务已经提交的数据,其它事务未提交数据当前事务不能读取。例如oracle默认的事务隔离级别就是读已提交。由于只能读取已经提交的数据,所以可能出现两次读取的数据不一致

    可重复读

    针对不可重复读的问题提出了可重复读的隔离等级,针对查询采用了MVCC多版本并发控制引入快照机制,每个事务都有自己的数据快照,即使其它事务提交数据,也不影响当前事务相关行的数据快照。幻读仍旧会出现

    串行化

    隔离等级最高,隔离效果最好,可以解决脏读、不可重复度和幻读问题,当时并发性最差。将事务的并发执行转换为顺序执行,后一个事务的执行必须等待前一个事务结束

    JDBC事务实现

    使用JDBC连接mysql默认每一个连接是自动提交事务的。如果需要使用JDBC执行多条语句,并要求组成一个事务一起执行的话

    1、在执行之前关闭自动提交,设置手动提交事务Connection的对象.setAutoCommit(false)

    2、如果执行成功,手动提交事务Connection的对象.commit();

    3、如果执行过程中出现异常,则手动回滚撤销操作Connection的对象.rollback();

    4、补充说明:在关闭Connection的对象之前,把连接对象设置回自动提交,Connection的对象.setAutoCommit(true)

  • 相关阅读:
    E5071C是德科技网络分析仪
    Python教程(12)——Python数据结构集合set介绍
    Android TextView富文本SpannableStringBuilder的使用详解
    学习pytorch8 土堆说卷积操作
    Unity初学者肯定能用得上的50个小技巧
    探索JavaScript ES6+新特性
    Astro是2023年最好的web框架,原因如下
    学生HTML个人网页作业作品 简单的IT技术个人简历模板html下载 简单个人网页设计作业 静态HTML个人博客主页
    荣电集团与钕希科技签署全面战略合作
    教学资源共享平台的设计
  • 原文地址:https://blog.csdn.net/qq_51074048/article/details/126166740