天天看点

Mysql事务前言一、事务的概念二、数据库中的事务三、数据库事务的操作总结

文章目录

  • 前言
  • 一、事务的概念
  • 二、数据库中的事务
    • 1.事务的特性 ACID
    • 2.事务的隔离级别
  • 三、数据库事务的操作
    • 1.什么情况下会出现事务
    • 2.开启事务(取消自动提交) 、回滚事务、提交事务
  • 总结

前言

一个事务是一个完整的业务逻辑单元,不可再分。可以理解为一件完整的事情。

提示:以下是本篇文章正文内容,下面案例可供参考

一、事务的概念

事务指逻辑上的一组操作,组成这组操作的各个单元,要不全部成功,要不全部不成功。

例如,A向B转账100,会其中要扣除A账户100,然后增加B账户100,这两步要么都成功,要么都失败,否则会出现问题

二、数据库中的事务

1.事务的特性 ACID

事务包含四大特性:原子性、一致性、隔离性、持久性。

  • 原子性(Atomicity)

    原子性是指事务是一个不可分割的工作单位,事务中的操作要么全部成功,要 么全部失败。比如在同一个事务中的SQL语句,要么全部执行成功,要么全部执行失败

  • 一致性(Consistency)

    官网上事务一致性的概念是:事务必须使数据库从一个一致性状态变换到另外一个一致性状态。以转账为例子,A向B转账,假设转账之前这两个用户的钱加起来总共是2000,那么A向B转账之后,不管这两个账户怎么转,A用户的钱和B用户的钱加起来的总额还是2000,这个就是事务的一致性。

  • 隔离性(Isolation)

    事务的隔离性是多个用户并发访问数据库时,数据库为每一个用户开启的事务,不能被其他事务的操作数据所干扰,多个并发事务之间要相互隔离。

  • 持久性(Durability)

    持久性是指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来即使数据库发生故障也不应该对其有任何影响

      

    注意:事务的四大特性中最麻烦的是隔离性,下面重点介绍一下事务的隔离级别

2.事务的隔离级别

引用自这篇文章

  • 串行化(Serializable,SQLite默认模式):最高级别的隔离。两个同时发生的事务100%隔离,每个事务有自己的"世界", 串行执行。
  • 可重复读(Repeatable read,MySQL默认模式):如果一个事务成功执行并且添加了新数据(事务提交),这些数据对其他正在执行的事务是可见的。但是如果事务成功修改了一条数据,修改结果对正在运行的事务不可见。所以,事务之间只是在新数据方面突破了隔离,对已存在的数据仍旧隔离。
  • 读取已提交(Read committed,Oracle、PostgreSQL、SQL Server默认模式):可重复读+新的隔离突破。如果事务A读取了数据D,然后数据D被事务B修改(或删除)并提交,事务A再次读取数据D时数据的变化(或删除)是可见的。这叫不可重复读(non-repeatable read)。
  • 读取未提交(Read uncommitted):最低级别的隔离,是读取已提交+新的隔离突破。如果事务A读取了数据D,然后数据D被事务B修改(但并未提交,事务B仍在运行中),事务A再次读取数据D时,数据修改是可见的。如果事务B回滚,那么事务A第二次读取的数据D是无意义的,因为那是事务B所做的从未发生的修改(已经回滚了嘛)。这叫脏读(dirty read)

    事务的隔离级别对应的sql操作

    1.查看事务隔离级别
    	SHOW VARIABLES LIKE 'tx_isolation';
    2.查看全局事务隔离级别
    	SHOW GLOBAL VARIABLES LIKE 'tx_isolation';
    3.使用系统变量查询
    	SELECT @@global.tx_isolation; SELECT @@session.tx_isolation; SELECT @@tx_isolation;
    4.设置Mysql的事务隔离级别
    	GLOBAL:设置全局的事务隔离级别 SESSION:设置当前session的事务隔离级别,如果语句没有指定GLOBAL或SESSION,默认值为SESSION
    	SET [GLOBAL | SESSION] TRANSACTION ISOLATION LEVEL
      	{
            REPEATABLE READ  可重复读
           | READ COMMITTED   读取已提交
           | READ UNCOMMITTED 读取未提交
           | SERIALIZABLE      串行化
       	}
    5.使用系统变量设置事务隔离级别
    SET GLOBAL tx_isolation='REPEATABLE-READ'; SET SESSION tx_isolation='SERIALIZABLE';
               

三、数据库事务的操作

首先明确一点,Mysql 数据库默认事务是自动提交的。

1.什么情况下会出现事务

默认情况下,一条DML(增删改)语句就是一个事务。或者手动开启 一个事务 。

2.开启事务(取消自动提交) 、回滚事务、提交事务

1.开启事务后,此事务的自动提交会关闭,需以回滚事务,或提交事务来结束事务
	start transaction;
2.回滚事务,是指撤销【开启事务】至【回滚事务】之间的所有DML操作
	rollback;
3.提交事务,是指将【开启事务】至【提交事务】之间的所有DML操作执行并持久化到数据库
	commit;
           

总结

关于事务的优秀文章推荐此链接