mysql事务

98 阅读4分钟
mysql事务
  • 数据库的事务(Transaction)是一种机制、一个操作序列,是访问和更新数据库的程序执行单元,包含了一组数据库操作命令。
  • 事务把所有的命令作为一个整体一起向系统提交或撤销操作请求,即这一组数据库命令要么都执行,要么都不执行,因此事务是一个不可分割的工作逻辑单元。
提交和回滚
start transaction;//事务的开始
//多条sql语句
commit;//提交

start transaction标识事务的开始,中间是多条sql语句,最后使用commit语句提交,这是在sql语句没有错误的情况下的正常流程,若是中间的sql语句出现了错误,应该使用rollback语句回滚sql操作,使数据库的数据回复到事务开始之前,防止出现数据错误。

mysql默认一条sql语句就是一个事务,事务结束自动提交。

在MySQL中,存在一些特殊的命令,如果在事务中执行了这些命令,会马上强制执行commit提交事务;如DDL语句(create table/drop table/alter/table)、lock tables语句等等。

不过,常用的select、insert、update和delete命令,都不会强制提交事务。

mysql的四种隔离级别
  • 序列化(SERIALIZABLE):如果隔离级别为序列化,则用户之间通过一个接一个顺序地执行当前的事务,这种隔离级别提供了事务之间最大限度的隔离。

  • 可重复读(REPEATABLE READ):在可重复读在这一隔离级别上,事务不会被看成是一个序列。不过,当前正在执行事务的变化仍然不能被外部看到,也就是说,如果用户在另外一个事务中执行同条 SELECT 语句数次,结果总是相同的。(因为正在执行的事务所产生的数据变化不能被外部看到)。

  • 提交读(READ COMMITTED):READ COMMITTED 隔离级别的安全性比 REPEATABLE READ 隔离级别的安全性要差。处于 READ COMMITTED 级别的事务可以看到其他事务对数据的修改。也就是说,在事务处理期间,如果其他事务修改了相应的表,那么同一个事务的多个 SELECT 语句可能返回不同的结果。

  • 未提交读(READ UNCOMMITTED):READ UNCOMMITTED 提供了事务之间最小限度的隔离。除了容易产生虚幻的读操作和不能重复的读操作外,处于这个隔离级的事务可以读到其他事务还没有提交的数据,如果这个事务使用其他事务不提交的变化作为计算的基础,然后那些未提交的变化被它们的父事务撤销,这就导致了大量的数据变化

    mysql中的默认隔离级别是可重复读(REPEATABLE READ)

    查看mysql的隔离级别

    SELECT @@GLOBAL.tx_isolation, @@tx_isolation;(mysql8之前)

    SELECT @@GLOBAL.transaction_isolation, @@transaction_isolation;(mysql8之后)

    修改mysql的隔离级别

    SET [SESSION | GLOBAL] TRANSACTION ISOLATION LEVEL {READ UNCOMMITTED | READ COMMITTED | REPEATABLE READ | SERIALIZABLE}
    

    其中,SESSION 和 GLOBAL 关键字用来指定修改的事务隔离级别的范围

    SESSION 表示修改的事务隔离级别将应用于当前 session(当前 cmd 窗口)内的所有事务;

    GLOBAL 表示修改的事务隔离级别将应用于所有 session(全局)中的所有事务,且当前已经存在的 session 不受影响;

    如果省略 SESSION 和 GLOBAL,表示修改的事务隔离级别将应用于当前 session 内的下一个还未开始的事务。

ACID特性

ACID是衡量事务的四个特性:

  • 原子性(Atomicity,或称不可分割性):事务应用最小的执行单元,不可再分。是事务中不可再分的最小逻辑执行体。
  • 一致性(Consistency):事务的执行结果,必须使数据库的从一个一致性的状态变到另一个一致性的状态。
  • 隔离性(Isolation):各个事务的执行互不干扰,任意一个事务的内部操作对其他并发的事务,都是隔离的。也就是:并发执行的事务之间不能看到对方的中间状态,并发执行的事务之间不能互相影响。
  • 持久性(Durability):持续性也称为持久性(Persistence) ,指事务一旦提交, 对数据所做的任何改变,都要记录到永久存储器中,通常就是保存在物理数据库中。