首页 > 数据库 >MySQL 事务详解

MySQL 事务详解

时间:2024-01-28 13:56:30浏览次数:40  
标签:事务 隔离 -- 详解 提交 MySQL 级别

在数据库中,事务是一组操作单元,它们被视为一个独立的工作单元,要么完全执行,要么完全不执行。MySQL提供了强大的事务支持,允许开发者以一致的方式管理数据库操作。

1. 事务基础

首先,我们需要了解事务的基础概念。一个事务通常包括以下几个关键特性:

  • 原子性(Atomicity): 事务中的所有操作要么全部执行成功,要么全部失败回滚,没有中间状态。

  • 一致性(Consistency): 事务开始前和结束后,数据库的完整性约束没有被破坏。

  • 隔离性(Isolation): 多个事务并发执行时,一个事务的执行不应影响其他事务的执行。

  • 持久性(Durability): 事务一旦提交,其结果应该是永久性的,即使系统崩溃也不应该丢失。

2. 开启事务

让我们通过一个简单的例子来了解如何在MySQL中开启一个事务。

-- 开启事务
START TRANSACTION;

-- 在此执行你的SQL语句

-- 提交事务
COMMIT;

-- 或者回滚事务
-- ROLLBACK;

这里,START TRANSACTION 表示事务的开始,而 COMMIT 则表示事务的提交。如果在执行过程中发生错误或者需要取消事务,可以使用 ROLLBACK 进行回滚。

3. 事务的隔离级别

MySQL支持多种事务隔离级别,可以根据需求选择合适的级别。常见的隔离级别有:

  • READ UNCOMMITTED: 允许事务读取其他事务未提交的数据,最低的隔离级别,但可能导致脏读、不可重复读和幻读。

  • READ COMMITTED: 保证一个事务不会读取到其他事务未提交的数据,解决了脏读的问题。

  • REPEATABLE READ: 保证一个事务在执行期间多次读取同一行数据时,会看到相同的数据。防止了脏读和不可重复读。

  • SERIALIZABLE: 最高的隔离级别,通过完全锁定读取的数据,避免了所有可能的并发问题,但性能开销较大。

在开启事务前,可以使用以下语句设置隔离级别:

SET TRANSACTION ISOLATION LEVEL <隔离级别>;

4. 事务的应用实例

4.1 转账操作

考虑一个简单的银行转账场景,确保转账是原子性的,要么成功,要么失败。

-- 开启事务
START TRANSACTION;

-- 扣除转出账户金额
UPDATE accounts SET balance = balance - 100 WHERE account_id = 1;

-- 增加转入账户金额
UPDATE accounts SET balance = balance + 100 WHERE account_id = 2;

-- 提交事务
COMMIT;

4.2 锁定行进行更新

在事务中锁定行进行更新,防止其他事务的干扰。

-- 开启事务
START TRANSACTION;

-- 锁定行进行更新
SELECT * FROM products WHERE product_id = 1 FOR UPDATE;

-- 在此执行其他SQL语句

-- 提交事务
COMMIT;

这样可以确保在事务中对于某一行数据的更新是独占的。

5. 总结

通过以上例子,我们了解了MySQL事务的基本概念、开启和提交事务的方法,以及事务隔离级别的设置。在实际应用中,合理使用事务可以确保数据的一致性和完整性,同时注意事务的隔离级别以及锁的使用,以提高系统的性能和并发能力。希望这篇文章对你理解MySQL事务有所帮助。

标签:事务,隔离,--,详解,提交,MySQL,级别
From: https://www.cnblogs.com/lyxlucky/p/17992822

相关文章

  • GOLAND 中 使用GORM ,出现 未发现“mysql”driver
    错误描述:sql:unknowndriver"mysql"(forgottenimport?)panic:runtimeerror:invalidmemoryaddressornilpointerdereference 解决过程:1、清除缓存2、添加包import_"github.com/go-sql-driver/mysql"_(下划线)用于导入包但不使用它的情况。......
  • MySQL 8.0.26 新增参数 group_replication_view_change_uuid
    MySQL8.0.26新增参数group_replication_view_change_uuidGreatSQL[root@localhost][test]>showglobalvariableslike'group_replication_view_change_uuid';+------------------------------------+-----------+|Variable_name|V......
  • MySQL的CHAR、VARCHAR、TEXT等字符串字段在等值比较("=")时,会忽略掉尾部的空格,导致有空
    一、现象CREATETABLE`user_info`(`id`BIGINT(20)UNSIGNEDNOTNULLAUTO_INCREMENTCOMMENT'主键自增ID',`user_name`VARCHAR(64)NOTNULLDEFAULT''COMMENT'名字',PRIMARYKEY(`id`),KEY`idx_user_name`(`user_name`))E......
  • C# 继承、多态性、抽象和接口详解:从入门到精通
    C#继承在C#中,可以将字段和方法从一个类继承到另一个类。我们将“继承概念”分为两类:派生类(子类)-从另一个类继承的类基类(父类)-被继承的类要从一个类继承,使用:符号。在以下示例中,Car类(子类)继承了Vehicle类(父类)的字段和方法:示例classVehicle//基类(父类){......
  • mysql连接报错:The server time zone value '�й���׼ʱ��'
    java.sql.SQLException:Theservertimezonevalue'�й���׼ʱ��'isunrecognizedorrepresentsmorethanonetimezone.YoumustconfigureeithertheserverorJDBCdriver(viatheserverTimezoneconfigurationproperty)touseamorespecifctimez......
  • MySQL-14.视图
    1.常见的数据库对象对象描述表(TABLE)表是存储数据的逻辑单元,以行和列的形式存在,列就是字段,行就是记录数据字典也叫系统表,存放数据库相关信息的表。系统表的数据通常由数据库系统维护,程序员通常不应该修改,只可查看约束(CONSTRAINT)执行数据校验的规则,用于保证......
  • 详解'unicodeescape' codec can't decode bytes in position 16-17: malformed \N ch
    详解'unicodeescape'codeccan'tdecodebytesinposition16-17:malformed\Ncharacterescape在Python的字符串处理中,有时候可能会遇到如下错误信息:'unicodeescape'codeccan'tdecodebytesinposition16-17:malformed\Ncharacterescape。本篇文章将详细解释这个错......
  • 为什么不推荐用 UUID 作为 Mysql 的主键
    学习改变命运,技术铸就辉煌。大家好,我是銘,全栈开发程序员。UUID是什么我们先来了解一下UUID是什么?UUID是指UniversallyUniqueIdentifier,翻译为中文是通用唯一识别码,UUID的目的是让分布式系统中的所有元素都能有唯一的识别信息。如此一来,每个人都可以创建不与其它人冲突......
  • JavaScript DOM对象的尺寸和位置详解
    在DOM对象操作中,其尺寸和位置也是DOM的核心内容,因为js的“交互式应用”几乎少不了对DOM对象的尺寸和位置进行操作,特别是js动画效果。一、关于DOM对象的尺寸和位置介绍DOM对象的尺寸和位置的属性DOM对象的属性描述obj.scrollWidth和obj.scrollHeightDOM对象的内部实......
  • JavaScript DOM之Cookie详解
    cookie有的地方习惯使用复数形式的cookies,指的是网站为了识别用户的身份或者进行一些必要数据的缓存而使用的技术,它的数据是存在用户的终端上,也就是在浏览器上的。一、什么是cookie随着互联网的不断发展各种基于互联网的服务系统逐渐多了起来,我们常常需要记录访问者的一些信息,比......