首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

mysql为什么用事务

MySQL使用事务主要是为了保证数据的一致性、完整性以及并发控制。事务是一组一起执行或者都不执行的数据库操作序列,它可以确保数据库从一个一致性状态转变到另一个一致性状态。

基础概念:

  • 原子性(Atomicity):事务中的所有操作要么全部完成,要么全部不完成,不存在只执行了部分操作的情况。
  • 一致性(Consistency):事务执行前后,数据库必须保持一致状态,即事务的执行不会破坏数据库的完整性约束。
  • 隔离性(Isolation):多个并发事务之间相互隔离,一个事务的执行不应影响其他事务。
  • 持久性(Durability):一旦事务被提交,其对数据库的更改就是永久性的,即使系统崩溃也不会丢失。

优势:

  • 数据一致性:通过事务,可以确保数据在各种操作后仍然保持有效和一致。
  • 并发控制:事务隔离级别可以防止并发事务之间的冲突,如脏读、不可重复读和幻读。
  • 错误恢复:如果事务中的某个操作失败,可以回滚整个事务,保证数据的正确性。

类型:

  • 扁平事务:最简单的事务类型,所有操作都在一个层次上。
  • 链式事务:事务提交后,释放的资源可以被下一个事务重用。
  • 嵌套事务:一个事务可以包含另一个事务,形成树状结构。
  • 分布式事务:跨越多个数据库节点的事务,需要全局事务管理器来协调。

应用场景:

  • 银行转账:转账操作需要保证从一个账户扣除金额和向另一个账户增加金额这两个动作要么同时成功,要么同时失败。
  • 在线购物:用户在网站上购买商品时,需要同时更新库存、生成订单、扣款等多个操作,这些都需要在一个事务中完成。
  • 数据备份与恢复:在进行数据备份时,需要将数据从一个状态转移到另一个状态,这个过程需要保证数据的一致性。

遇到的问题及解决方法:

  • 死锁:两个或多个事务互相等待对方释放资源,导致都无法继续执行。解决方法是设置合理的超时时间,并使用死锁检测机制来自动解决死锁。
  • 脏读:一个事务读取了另一个未提交事务的数据。通过设置适当的隔离级别可以避免脏读。
  • 性能问题:事务处理可能会降低数据库性能,特别是在高并发环境下。优化事务逻辑、减少事务范围、合理设置隔离级别等方法可以提高性能。

示例代码:

代码语言:txt
复制
START TRANSACTION;
-- 执行一系列数据库操作
UPDATE accounts SET balance = balance - 100 WHERE id = 1;
UPDATE accounts SET balance = balance + 100 WHERE id = 2;
-- 如果一切正常,则提交事务
COMMIT;
-- 如果出现错误,则回滚事务
-- ROLLBACK;

参考链接:

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

为什么MySQL默认事务隔离级别是RR

曾多次听到“MySQL为什么选择RR为默认隔离级别”的问题,其实这是个历史遗留问题,当前以及解决,但是MySQL的各个版本沿用了原有习惯。历史版本中的问题是什么,本次就通过简单的测试来说明一下。...步骤说明如下: 步骤1 -   分别查看两个会话中的事务隔离级别及binlog格式(隔离级别均为RR,binlog为ROW格式) 步骤2 -   SESSION A 开启事务,更新users 表中c_id...步骤4-   SESSION A 提交事务(此步骤也可以在步骤3时操作,结果不一样,后续步骤中将采用此方式) 步骤5-   SESSION B 重启事务,再次删除class表中 c_id等于2的记录,此时提交可以成功了...步骤说明如下: 步骤1 -   分别查看两个会话中的事务隔离级别及binlog格式(隔离级别均为RR,binlog为STATENENT格式) 步骤2 -   SESSION A 开启事务,更新users...步骤说明如下: 步骤1 -   分别查看两个会话中的事务隔离级别及binlog格式(隔离级别均为RC,binlog为ROW格式) 步骤2 -   SESSION A 开启事务,更新users 表中c_id

1.4K10

gorm谈谈mysql中的事务操作

这个时候有的小伙伴会跳出来说用事务。...是的,因为事务具有一下特性: 原子性(Atomicity) 一致性(Consistency) 隔离性(Isolation) 持久性(Durability) 但是开启了事务就可以了么? ?...下面我们以gorm为例讲解一下,为什么,同时让大家熟悉一下gorm的是如何开启事务的。...() 手动开启事务 lock表 成功 账户剩余金额: 0 支付成功的订单数: 10 复制代码 payOrderTransactionUnlockTest() 手动开启事务没有lock表 失败 账户剩余金额...: 0 支付成功的订单数: 10 综上所述,mysql在开启事务的情况下也不能防止刷单,还要加上for update 在gorm中,我们可以这样为SQL加上for update Set("gorm:query_option

7.2K11
  • MySQL 事务

    MySQL中,事务具有以下四个特性,通常称为ACID特性: 1.原子性(Atomicity):事务中的所有操作要么全部执行成功,要么全部失败。...在MySQL中,可以使用以下命令来控制事务: •START TRANSACTION; or BEGIN;:开始一个新的事务。•COMMIT;:提交当前事务,使事务中的所有修改生效。...事务并发 事务并发是指多个事务同时执行,这可能会导致以下问题: 1.丢失更新:当两个或多个事务同时对相同的数据进行更新时,最后提交的事务可能会覆盖之前提交的事务所做的修改,导致之前的更新丢失。...MySQL支持以下四种事务隔离级别: 1.未提交读(Read Uncommitted):允许一个事务读取另一个事务未提交的数据。这可能导致脏读、不可重复读、幻读。...查看、设置MySQL事务隔离级别 -- 查看事务隔离级别 -- 使用系统变量查询 SELECT @@transaction_isolation; -- 5.7.20之前 SHOW VARIABLES

    9810

    Mysql事务

    MySQL数据库,mysql -uroot -p123456进行MySQL登录,在完成TCP握手之后,连接器会根据输入的用户名和密码验证身份,若错误会提示:Access denied for user,...MySQL执行流程 提交和回滚 MySQL事务是如下操作的 begin; -- 或者start transaction -- 1条或者n条sql语句 commit; begin或start transaction...只有同时满足ACID才是事务;但是在各大数据库厂商实现中,完全满足ACID的少之又少,例如MySQL的NDB Cluster事务不满足持久性和隔离性;InnoDB默认事务隔离级别是可重复读,不满足隔离性...redo log 也需要在事务提交的时候将日志写入磁盘,为什么比直接将Buffer Pool中修改的数据写入磁盘(刷脏)要快?...相关文章 Mysql中的索引 Mysql通过binlog恢复数据 Mysql之binlog三种模式 Mysql中的binlog入门介绍

    1.7K10

    mysql 事务

    1)查看哪些引擎支持事务: SQL: Show engines; 2)查看表引擎类型: Show create table table_name; 3)查看是否自动提交: show variables...like ‘%autocommit%’; 4)事务开始的方法: a) mysql_autocommit(0); 如果程序在此处coredump,请检查是否connect db b) SQL:Set autocommit...=0; c) Begin work; d) Start transaction; 5)事务结束的方法: a) SQL:Commit/rollback b) Mysql_commit/mysqlrollback...c) 隐式事务,参考http://blog.csdn.net/blues1021/article/details/6329190 并发事务: 锁机制: 乐观锁:通过where条件控制、通过version...字段或自定义字段的值控制; update影响的行数:mysql_affected_rows的返回值,可根据它决定事务是否终止 悲观锁=排他锁 Select  * from table for update

    2.4K10

    MySQL事务

    几个并行执行的事务,其执行结果必须与按某一顺序串行执行的结果相一致 隔离性(Isolation):事务的执行不受其他事务的干扰,事务执行的中间结果对其他事务必须是透明的 持久性(Durability):...对于任意已提交事务,系统必须保证该事务对数据库的改变不被丢失,即使数据库出现故障 提交 默认隔离级别可重复读,若事务级别为读已提交,则终端二不commit的情况下可以读取到终端一的数据。...### 终端一 begin; 开启 insert into students (sname) value ("sss"); commit; 只有commit才表示执行成功 ### 终端二 mysql>...insert into students (sname) value ("kksk"); 测试语句 ### 终端二 mysql> select * from students; +----+-----...-+ | id | sname | +----+-------+ | 1 | Gage | | 2 | sss | | 4 | kksk | +----+-------+ 查看隔离级别 mysql

    2.2K40

    Mysql事务

    事务是一组被视为单个逻辑单元的操作,这些操作要么全部执行成功,要么全部回滚。在数据库中,事务是确保数据完整性和一致性的重要机制。以下是关于事务的一些基本概念和用法。 事务是什么?...持久性(Durability):事务执行后,对数据库的修改应该是永久性的。 事务的语法 Mysql 中使用 START TRANSACTION 和 COMMIT 或 ROLLBACK 语句来控制事务。...事务有三种状态: 活动状态:这是事务的起始状态,表示事务正在执行中。...在此状态下,事务已经执行完毕,但是还没有被提交。在这个状态下,数据库引擎将会等待用户提交事务或者回滚事务的操作。...Mysql 支持四种隔离级别: 读未提交(READ UNCOMMITTED):这个隔离级别最宽松,允许事务读取其他事务未提交的数据。

    15210

    MySQL·事务

    MySQL 默认采用自动提交模式,对于单条 SQL 语句,数据库系统自动将其作为一个事务执行,这种事务被称为隐式事务。...有些时候,我们希望主动让事务失败,这时可以 ROLLBACK 回滚事务,整个事务会失败: BEGIN; UPDATE accounts SET balance = balance - 100 WHERE...分别开启两个 MySQL 客户端连接,按顺序依次执行事务 A 和事务 B: 时刻 事务 A 事务 B 1 SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED...分别开启两个 MySQL 客户端连接,按顺序依次执行事务 A 和事务 B: 时刻 事务 A 事务 B 1 SET TRANSACTION ISOLATION LEVEL READ COMMITTED;...分别开启两个 MySQL 客户端连接,按顺序依次执行事务 A 和事务 B: 时刻 事务 A 事务 B 1 SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;

    1.8K10

    MySQL事务

    二、为什么会出现事务 事务MySQL 编写者设计出来,本质是为了当应用程序访问数据库的时候,事务能够简化我们的编程模型,不需要我们去考虑各种各样的潜在错误和并发问题。...'; 我们可以 SET 来改变 MySQL 的自动提交模式:SET AUTOCOMMIT=0; 禁止自动提交。...为什么呢?比如我们在出生之前,能不能看到过去的世界呢?不能,我们也不应该看得到!又比如已经过世的故人,能不能看到我们今天的世界呢?也不能!所以回到事务事务也是一样的!...(实际生产中不可能使用这种隔离级别的),但是相当于没有任何隔离性,也会有很多并发问题,如脏读,幻读,不可重复读等,我们上面为了更好地观察现象,的就是这个隔离性。...但是,一般的数据库在可重复读情况的时候,无法屏蔽其他事务 insert 的数据,为什么呢?

    10610

    MySQL事务

    隔离性:一个事物在最终提交之前,数据的改变对其他事务是不可见的。 持久性:事务的最终操作结果能被持久保存。 MySQL事务 接下来我们介绍MySQL中的事务是如何保证ACID特性的。...(以下不做特殊说明,都默认InnoDB引擎) 原子性: 我们在MySQL中可以使用以下语句开启一个事务: BEGIN / START TRANSACTION (START TRANSACTION还可以指定只读事务和读写事务...如果执行commit的话,MySQL把最终结果刷到磁盘中。为了保证事务执行中,异常宕机导致事务仍可回滚,undo log的数据也是会被持久化到磁盘的。...如何保证在实例异常崩溃情况下的一致性,MySQL主要依靠Doublewrite、crash recover来保证事务的一致性。为什么需要Doublewrite?...为什么是101不是2呢?因为事务二已经对id=1的列进行了修改,此时如果事务一还是按照事务初始记录的状态更新数据会导致,事务二的更新操作丢失,而出现数据不一致,这个时候就需要读当前数据了。

    2.1K20

    MySQL事务

    什么是事务事务就是保证一组数据库操作要么全部成功,要么全部失败。MySQL中,事务的支持是在引擎层实现的。...原子性(Atomicity) 一致性(Consistency) 隔离性(Isolation) 持久性(Durability) 为什么需要隔离级别?...200条,此时就产生了幻读问题 MySQL事务隔离级别 读未提交:一个事务还未提交,它的变更可以被其他事务看到 读提交:一个事务提交以后,它的变更才可以被其他事务看到 可重复读:一个事务执行过程中看到的数据始终保持和事务启动时看到的数据一致...关于MVCC的详细细节我们在后续了解完锁以后一起说,这样update语句的所有操作基本就全了(锁+事务+日志)。 MySQL的回滚日志什么时候删除?...因此如果系统中存在过多的长事务,会导致数据库存储空间增加迅速,并且也会占用锁资源,将有可能拖垮整个库。 MySQL如何启动事务? 1.set autocommit=1; 该方式下事务会自动提交。

    79510

    MySQL事务

    目录: 事务四大特性 数据库的并发问题 数据库事务的隔离性 隔离级别 设置隔离级别 隐式事务 显式事务 事务四大特性 原子性 原子性是指事务是最小单位,不可分割,事务中的所有操作要么全部成功,...隔离级别 一个事务与其他事务隔离的程度称为隔离级别,数据库中规定了4种事务隔离级别,不同隔离级别对应不同的干扰程度,隔离级别越高,数据一致性越好,但是并发越差 四种隔离级别 MySQL支持4种隔离级别...committed,serializable,默认是同read committed; SQL Server 支持4种隔离级别,默认使用read committed隔离级别; 设置隔离级别 每次启动一个mysql...默认情况下,MySQL,SQL Server,Oracle开启了自动提交的事务。...查看事务: show variables like 'autocommit'; 显式事务 显式事务是需要手动开启事务,并且提交事务的。 在使用显式事务前必须将隐式事务改为显式事务

    2.2K10

    Mysql事务

    事务 简单来说,事务就是操作一系列事件,要么全部完成,要么全部不完成。...特性(ACID) 原子性:一系列事件,要么全部完成,要么全部不完成 一致性:在事务开始之前和事务结束以后,数据库的完整性没有被破坏 持久性:事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失...账号2 人民币50元 public static void main(String[] args) throws SQLException { String url = "jdbc:mysql...,不可重复读,虚读 Serializable隔离级别下的事务具有最高的安全性,但是,由于事务是串行执行,所以效率会大大下降 建议细看:事务隔离级别的图文 脏读:一个事务读取到另外一个事务未提交的数据...丢失修改:两个事务同时访问数据,第一个修改数据后,第二个也修改数据,导致第一个修改数据丢失 不可重复读:第一个事务读取到数据后,另外一个事务修改数据并提交后第一个事务再次读取,第一个事务两次读取的数据不一样

    1.6K20

    MySQL——事务

    事务概述 事务是数据库系统区别于其他一切文件系统的重要特性之一 事务是一组具有原子性的SQL语句,或是一个独立的工作单元 事务特点 1....原子性 一个事务必须被视为不可分离的最小工作单位,整个事务中的所有操作要么全部提交成功,要么全部失败,对于一个事务来说,不可能只执行其中的一部分操作。...一致性(CONSISTENCY) 一致性是指事务将数据库从一种一致性状态转换到另外一种一致性状态,在事务开始之前和事务结束后数据库中数据的完整性没有被破坏。...3.隔离性(ISOLATION) 隔离性要求一个事务对数据库中数据的修改,在未提交完成之前对于其他事务是不可见的。...大事务 运行的时间比较长,操作的数据比较多的事务 风险: 锁定太多的数据,造成大量的阻塞和锁超时 回滚所需要的时间比较长 执行时间长,容易造成主从延迟 如何处理大事务

    1.7K20

    MySQL 事务

    原子性,在 InnoDB 里面是通过 undo log 来实现的,它记录了数据修改之前的值(逻辑日志),一旦发生异常,就可以 undo log 来实现回滚操作。 持久性怎么实现呢?...insert) 你可能会说,事务不是有隔离性吗,为什么还有这么多问题?...所以你会说,既然我们比较常用的是RR(可重复读)的隔离级别会有幻读的情况,那为什么还经常使用它?其实在MySQL的InnoDB引擎使用RR的隔离级别但配合锁的机制已经避免了幻读情况。...小伙手撕MySQL事务,发生了什么? MVCC 的查找规则1:只能查找创建时间小于等于当前事务 ID 的数据 小伙手撕MySQL事务,发生了什么?...事务5,尝试修改数据 小伙手撕MySQL事务,发生了什么? 此时回到事务2再次查询数据 小伙手撕MySQL事务,发生了什么?

    1.7K40

    MySQL 事务

    事务事务开始(begin transaction)和事务结束(end transaction)之间执行的全体操作组成。在 MySQL 中只有使用了 Innodb 数据库引擎的数据库或表才支持事务。...1.1.2 为什么需要事务   假如说:老王有 1000,老李有 1000,老王给老李转账 500。...1.2.2 事务处理 ☞ BEGIN, ROLLBACK, COMMIT 来实现 begin # 开始一个事务 // TODO··· rollback # 事务回滚 commit # 事务提交 ☞...直接 SET 来改变 MySQL 的自动提交模式: # 查看事务提交哦方式 select @@autocommit; # 禁止自动提交 set autocommit = 0; # 开启自动提交... BEGIN, ROLLBACK, COMMIT 来实现只将当前的作为一个事务! 1.2.3 事务隔离级别   对于两个并发执行的事务,如果涉及到操作同一条记录的时候,可能会发生问题。

    2.1K31

    MySQL事务

    一、事务概述 1.1、什么是事务 MySQL 事务主要用于处理操作量大,复杂度高的数据。...1.3、事务提交方式 mysql中有两种事务提交方式: 手动提交 自动提交 二、事务手动提交 2.1、手动提交的过程 事务执行成功的过程:开启事务->执行多条件SQL语句->成功->事务提交 事务执行失败的过程...MySQL 默认每一条 DML(增删改)语句都是一个单独的事务,每条语句都会自动开启一个事务,语句执行完毕自动提交事务MySQL 默认开始自动提交事务。...如: 事务开始->update/delete/insert into->事务提交 3.1、自动提交事务 案例: 自动事务提交:往张三的帐户里存入1000元,目前数据库数据如下: mysql> update...事务的提交或回滚,提交:同步临时日志文件中的SQL操作结果到数据库表;回滚:清除临时日志文件 5、事务回滚 我们可以在mysql事务处理过程中定义保存点(SAVEPOINT),然后回滚到指定的保存点前的状态

    4.2K10
    领券