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

mysql设置事物的提交

基础概念

MySQL中的事务(Transaction)是一组一起执行或都不执行的SQL语句。事务的主要目的是为了保证数据的一致性和完整性。事务具有四个特性,通常称为ACID特性:

  1. 原子性(Atomicity):事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。
  2. 一致性(Consistency):事务必须使数据库从一个一致性状态变换到另一个一致性状态。
  3. 隔离性(Isolation):事务的执行不能被其他事务干扰,即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不会互相干扰。
  4. 持久性(Durability):一旦事务提交,则其结果就是永久的,即使系统崩溃也不会丢失。

相关优势

  • 数据一致性:通过事务,可以确保数据库的状态在事务开始和结束时都是一致的。
  • 并发控制:事务隔离级别可以控制并发事务之间的数据可见性,防止数据不一致。
  • 故障恢复:事务日志可以用于系统恢复,确保在系统崩溃后能够恢复到一致的状态。

类型

MySQL支持两种类型的事务:

  1. 隐式事务:默认情况下,MySQL在执行DML(数据操纵语言)语句时自动开启事务,并在执行完毕后自动提交。
  2. 显式事务:需要手动开启事务、提交事务或回滚事务。

应用场景

事务广泛应用于需要保证数据一致性和完整性的场景,例如:

  • 银行转账:从一个账户扣除金额并添加到另一个账户。
  • 订单处理:创建订单、更新库存、扣款等操作。
  • 用户注册:创建用户账户、记录用户信息等。

设置事务提交

在MySQL中,可以通过以下方式设置事务的提交:

显式事务

代码语言:txt
复制
START TRANSACTION; -- 开启事务

-- 执行一系列SQL语句
INSERT INTO table1 (column1, column2) VALUES ('value1', 'value2');
UPDATE table2 SET column1 = 'value3' WHERE condition;

COMMIT; -- 提交事务
-- 或者
ROLLBACK; -- 回滚事务

隐式事务

代码语言:txt
复制
SET autocommit = 0; -- 关闭自动提交

-- 执行一系列SQL语句
INSERT INTO table1 (column1, column2) VALUES ('value1', 'value2');
UPDATE table2 SET column1 = 'value3' WHERE condition;

COMMIT; -- 提交事务
-- 或者
ROLLBACK; -- 回滚事务

SET autocommit = 1; -- 开启自动提交

常见问题及解决方法

事务隔离级别设置不当

问题:在高并发环境下,可能会出现脏读、不可重复读或幻读等问题。

原因:事务隔离级别设置不当,导致并发事务之间的数据可见性问题。

解决方法:根据具体需求调整事务隔离级别。

代码语言:txt
复制
SET TRANSACTION ISOLATION LEVEL READ COMMITTED; -- 读已提交
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ; -- 可重复读
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE; -- 串行化

死锁

问题:两个或多个事务互相等待对方释放资源,导致事务无法继续执行。

原因:事务之间的资源竞争。

解决方法:优化事务逻辑,减少事务持有锁的时间,或者使用数据库提供的死锁检测和解决机制。

代码语言:txt
复制
-- 示例:优化事务逻辑
START TRANSACTION;
SELECT * FROM table1 WHERE condition FOR UPDATE;
-- 执行其他操作
COMMIT;

参考链接

通过以上设置和优化,可以确保MySQL事务的正确性和高效性。

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

相关·内容

MySQL 事物

事务是数据库处理操作,其中执行就好像它是一个单一的一组有序的工作单元。换言之,事务将永远不会是完全的,除非在组内每个单独的操作是成功的。如果事务中的任何操作失败,整个事务将失败。...3.事务操作的关键字   自动提交事务开关set autocommit=0   开始事务 start transaction /begin   提交事务 commit   回滚事务 rollback  ...COMMIT UPDATE bank SET currentMoney=500000  WHERE customerName='小黑'; --  证明mysql是默认提交事务的!...SET  autocommit=0(关闭事务自动提交) | 1(开启事务自动提交) -- 关闭事务自动提交  SET  autocommit=0; BEGIN;   --  开启事务  UPDATE bank...  UPDATE  bank SET currentMoney=10000; ROLLBACK;   -- 事务回滚 SET  autocommit=1;  -- 恢复自动提交

1.5K80

MySQL事物

文章目录 MySQL事物 1、事务概念 2、事物处理命令 3、ACID特性 4、事务并发存在的问题 5、事务的隔离级别 MySQL事物 1、事务概念 事务是一组SQL语句的执行,要么全部成功,要么全部失败...)到最初的状态 2、事物处理命令 #查看MySQL是否自动提交事务 SELECT @@AUTOCOMMIT;#0表示手动提交事务,1表示自动提交事务 #设置事务提交方式为手动提交方式 set autocommit...=0; #开启一个事务 BEGIN; #提交一个事务 COMMIT; #回滚一个事务到初始的位置 ROLLBACK; #设置一个名字为point1的保存点 SAVEPOINT point1; #事务回滚到保存点...例如,事物再提交之后,在数据库刷盘过程中,即便因为故障出错,也应该能够恢复数据 ACID的底层实现: ACD依靠的是数据库的redo log和undo log实现的;I是依赖数据库的锁实现的 4、事务并发存在的问题...,幻读是基于条数增加或者减少的错误 5、事务的隔离级别 MySQL支持的四种隔离级别是: 1、TRANSACTION_READ_UNCOMMITED 未提交读:说明在提交前一个事务可以看到另一个事务的变化

1.3K30
  • Mysql事物

    Mysql事物 事物这个东西大家应该写过项目的就用过,但是还是要说的 为什么需要事物 现在很多软件都是多用户,多程序,多线程的,对同一张表可能同时有很多人在用,为保持数据的一致性,所以提出了事物的概念...; 持久性并不是数据库的角度完全能解决的 事物的隔离级别 未提交读(read uncommitted)脏读 已提交读(read committed)不可重复读 可重复读(repeatable read)...可串行化(serializable) 查询Mysql事物的默认隔离级别 select @@tx_isolation; ?  ...Mysql事物的默认隔离级别是repeatable read 事物并发问题 脏读:事物A读取了事物B更新的数据,然后B回滚操作,那么A就读取到了脏数据 不可重复读:事物A多次读取同一数据,事物B在事物A...,当系统管理员A改完之后发现还有没改的,就像幻觉一样,这就是幻读 不可重复读和幻读容易混淆,不可重复读侧重于修改,幻读侧重于新增或删除,解决不可重复读的问题只需锁住满足条件的行,解决幻读需要锁表 //设置当前会话的事物隔离级别

    1.3K40

    Mysql事物和锁

    众所周知,事务和锁是mysql中非常重要功能,同时也是面试的重点和难点。本文会详细介绍事务和锁的相关概念及其实现原理,相信大家看完之后,一定会对事务和锁有更加深入的理解。...本文主要内容是根据掘金小册《从根儿上理解 MySQL》整理而来。如想详细了解,建议购买掘金小册阅读。...image.png 如上图,我们在Session B中提交了几个隐式事务(mysql会自动为增删改语句加事务),这些事务都修改了number列为1的记录的列name的值,每次事务提交之后,如果Session...在MySQL中,READ COMMITTED和REPEATABLE READ隔离级别的的一个非常大的区别就是它们生成ReadView的时机不同。...mysql默认行锁类型就是 临键锁(Next-Key Locks) 。

    1.7K50

    MySQL事物与锁

    1.1 前言   之前做过一些项目会用到MySQL中的事物,也会根据需要配置事物的隔离级别,比如下图在切面中添加事物: ? 那么事物究竟是什么呢?今天和大家一起探讨学习一下。...否则,如果我们把 autocommit 设置成 false/off,那么数据库的事务就需要我们手 动地去开启和手动地去结束。   ...第二个隔离级别叫做:Read Committed(已提交读),也就是一个事务只能读取到其他事务已提交的数据,不能读取到其他事务未提交的数据,它解决了脏读的问题, 但是会出现不可重复读的问题。   ...那么 InnoDB 的实现又是怎么样的呢? 1.8 MySQL InnoDB 对隔离级别的支持   在 MySQL InnoDB 里面,不需要使用串行化的隔离级别去解决所有问题。...2 MySQL InnoDB 锁的基本类型   https://dev.mysql.com/doc/refman/5.7/en/innodb-locking.html   官网把锁分成了 8 类。

    1.7K20

    mysql的事物隔离级别详解

    =utf8; 然后向这个表里插入一条数据: INSERT INTO t VALUES(1, '刘备'); 现在表里的数据就是这样的: mysql> SELECT * FROM t;+----+-----...---+| id | c |+----+--------+| 1 | 刘备 |+----+--------+1 row in set (0.01 sec) 隔离级别 MySQL是一个服务器...已提交读(READ COMMITTED) 如果一个事务只能读到另一个已经提交的事务修改过的数据,并且其他事务每对该数据进行一次修改并提交后,该事务都能查询得到最新值,那么这种隔离级别就称之为已提交读(英文名...比方说我们的表t现在只包含一条记录: mysql> SELECT * FROM t;+----+--------+| id | c |+----+--------+| 1 | 刘备 |+...在MySQL中,READ COMMITTED和REPEATABLE READ隔离级别的的一个非常大的区别就是它们生成ReadView的时机不同,我们来看一下。

    1.2K20

    MySQL GTID全局事物标识

    一、GTID详细介绍1.1 GTID概述(1)全局事物标识:global transaction identifieds。(2)GTID事物是全局唯一性的,且一个事务对应一个GTID。...(5)MySQL-5.6.5开始支持的,MySQL-5.6.10后开始完善。...1.2 GTID的组成部分GTID (Global Transaction ID) 是对于一个已提交事务的编号,并且是一个全局唯一的编号。 GTID 实际上 是由 UUID+TID 组成的。...其中 UUID 是一个 MySQL 实例的唯一标识。TID 代表了该实例上已经提交的事务数量,并且随着事务提交单调递增。...(2)更简单的搭建主从复制。(3)比传统复制更加安全。(4)GTID是连续没有空洞的,因此主从库出现数据冲突时,可以用添加空事物的方式进行跳过。

    6300

    Mysql-2-事物特性(ACID)原理

    (在事物开始之前和事物结束以后,数据库的完整性没有被破坏)3、隔离性(Isolation):并发事物,相互之间不能影响(防止多个事物并发执行时由于交叉执行而导致的数据不一致问题)4、持久性(Durability...):是指事物提交后,数据就永久的保存到数据库(不会因为系统故障而丢失数据)1、原子性:通过 undo log(回滚日志)来保证的2、一致性:原子性、隔离性、持久性这三种特性就是为了保证数据库的有一致性3...mysql的锁有表锁,行锁,间隙锁,好像还有一个锁数据库的,叫全局锁还是什么来着。...redo_log 采用两阶段提交的方式: redo_log(prepare):记录新数据,更新redo_log状态为预提交状态。...mysql的一个update需要经历什么最终持久化到磁盘?

    12010

    springboot mysql事物_SpringBoot事务详细简介

    大家好,又见面了,我是你们的朋友全栈君。 重要概念 自动提交模式 对于mysql数据库,默认情况下,数据库处于自动提交模式。...每一条语句处于一个单独的事务中,在这条语句执行完毕时,如果执行成功则隐式的提交事务,如果执行失败则隐式的回滚事务。...对于正常的事务管理,是一组相关的操作处于一个事务之中,因此必须关闭数据库的自动提交模式,下面是查看方式: 查看是否自动提交命令(ON表示开启自动提交,值为1,OFF表示关闭自动提交,值为0):show...variables like ‘autocommit’; 关闭自动提交后,则用户将一直处于某个事务中,直到执行一条commit提交或rollback语句才会结束当前事务重新开始一个新的事务。...回退事务的几个重要操作 1、设置保存点 savepoint a 2、取消保存点a之后事务 rollback to a 3、取消全部事务 rollback 注意:这个回退事务,必须是没有commit前使用的

    1.1K20

    redis的事物

    涉及到的相关命令 multi exec discard watch unwatch 1:multi,exec 对于一般的关系型数据库的事物来说,事物的执行过程无非为 生成事物 产生命令 执行事物。...redis的事物过程 可以看到,在我们执行set的时候命令并没有执行,而是写入到了一个控制事物的队列中,返回的信息是QUEUED,在最后exec的时候命令才是真正的执行,并且返回执行结果 2:一般事物都有...redis不支持rollback演示 在图中mset命令语法是没有问题的,成功的入到了事物中,执行之后返回结果中第一步成功执行,但是在mset的时候返回错误。...所以类似于这种错误,是需要我们在编程的过程中就避免的,而不应该到生产环境中的。 Redis事物只能检查出语法错误,如果发现语法错误,整个事物直接结束 ?...redis的事物的语法错误 Discard其实就是在multi之后 清楚事物队列,没什么好说的 3:WATCH WATCH key [key ...]

    85020

    一篇吃透mysql事物体系

    Mysql事物 必备基础 mysql显示事物、mysql隐式事物(默认) 隐式事物,update inset帮我们隐式的提交 显示: begin(begin work/start transaction...可能会问你保存点savepoint 但是begin/start虽然会设置autocommit 为off 但是还是可能会隐式提交!!!!!!!!...读已提交,RR可重复读,Serializable可串行化 问题, 读未提交有脏读问题,RC隔离级别有不可重复读问题,RR有幻读问题 mysql默认为RR隔离级别 何为脏读,幻读,不可重复读 脏读指的是读到了其他事物未提交的数据...AUTO-INC锁:Auto-AutoIncreatement 主键设置自增id的时候,防止事物id一样 显然这样粒度太大,插的时候锁表,所以innoDB弄了个轻量级锁,前提是先预先知道插入多少条数据...这里指的是,mysql服务在重启的时候可根据redo log恢复 事物已经提交,但是还没写入ibd文件中的数据 从而达到对事物提交的数据完成持久化操作 图片 图片 rodo logBUffer写日志到Redo

    926171

    spring的事物 原

    最近做一个项目,需要对事物着重处理,找了点资料重新整理一个一下,留作备忘。     首先讲讲什么是spring事物。     Spring事务让我们从复杂的事务处理中得到解脱。...使得我们再也无需要去处理获得连接、关闭连接、事务提交和回滚等这些操作。再也无需要我们在与事务相关的方法中处理大量的try…catch…finally代码。...ISOLATION_READ_COMMITTED  保证一个事务修改的数据提交后才能被另外一个事务读取。另外一个事务不能读取该事务未提交的数据。...也就是说,比如事务A的未提交(还依然缓存)的数据被事务B读走,如果事务A失败回滚,会导致事务B所读取的的数据是错误的。         ...潜套事务是外部事务的一部分, 只有外部事务结束后它才会被提交。

    74320

    MySQL默认事物隔离级别_sqlserver事务隔离级别

    大家好,又见面了,我是你们的朋友全栈君。 mysql数据库事务的隔离级别有4个,而默认的事务处理级别就是【REPEATABLE-READ】,也就是可重复读。...下面本篇文章就来带大家了解一下mysql的这4种事务的隔离级别,希望对大家有所帮助。 SQL标准定义了4类隔离级别,包括了一些具体规则,用来限定事务内外的哪些改变是可见的,哪些是不可见的。...mysql的4种事务隔离级别,如下所示: 1、未提交读(Read Uncommitted):允许脏读,也就是可能读取到其他会话中未提交事务修改的数据 2、提交读(Read Committed):只能读取到已经提交的数据...在SQL标准中,该隔离级别消除了不可重复读,但是还存在幻象读,但是innoDB解决了幻读 4、串行读(Serializable):完全串行化的读,每次读都需要获得表级共享锁,读写相互都会阻塞 相关mysql...视频教程推荐:《mysql教程》 版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。

    3.3K20

    【JDBC】JDBC API 详解 ② ( Connection 数据库连接对象 | 获取 SQL 执行对象 - 普通、预编译 SQL 语句 | 事务管理 | 开启事物 | 提交事物 | 回滚事物 )

    SQL 语句的增删查改的结果 ; Connection 数据库连接对象 有两个作用 : 获取 SQL 执行对象 管理事物 1、获取 SQL 执行对象 Connection 数据库连接对象 可以 获取 SQL...: autoCommit 参数为 true 自动提交事物 , false 手动提交事物 ; void setAutoCommit(boolean autoCommit) throws SQLException..., 首先 , 先 获取 Connection 数据库连接对象 ; conn = DriverManager.getConnection(url, username, password); 然后 , 设置手动提交事物...; conn.setAutoCommit(false); // 设置手动提交事务 再后 , 获取 预编译 SQL 语句的 SQL 执行对象 , 设置预编译的 SQL 语句 ; pstmt = conn.prepareStatement...; 最后 , 提交事物 ; conn.commit(); // 提交事务 此外 , 如果执行事物过程出现异常 , 则回滚事物 ; conn.rollback(); // 回滚事务 完整代码示例 : Connection

    1K40

    MySQL架构(三)mysql的两阶段提交

    Mysql 的两阶段提交 在 MySQL架构(二)SQL 更新语句是如何执行的?...两阶段过程异常崩溃处理 如果在两阶段提交的方式下,在 binlog 日志写完,事务在没有 commit 前,即 redo log 日志还没记录 commit 前,mysql 进程发生异常崩溃,MySQL...首先,我们看一下完整的两阶段提交流程,分为准备阶段和提交阶段。 在准备阶段,MySQL 先将数据修改写入 redo log 日志,并将其标记为 prepare 状态,即事务还处于未提交状态。...再将对应的 SQL 语句写入 bin log 日志。 在提交阶段,事务完成提交,MySQL 将 redo log 日志标记为 commit 状态。...知道了两阶段提交流程后,我们再来看一下异常崩溃后,mysql 是如何恢复数据的。 若 redo log 日志里记录了完整的事务,即已经处于 commit 状态,则直接提交恢复。

    19710

    spring的事物配置 原

    " />           <property name="url"               value="jdbc:mysql://localhost:3306/test?...Spring使用声明式事务处理,默认情况下,如果被注解的数据库操作方法中发生了unchecked异常,所有的数据库操作将rollback;如果发生的异常是checked异常,默认情况下数据库操作还是会提交的...另外此注解要是只在接口上写, 接口的实现类就会继承下来、接口的实现类的具体方法,可以覆盖类声明处的设置  。     ...你当然可以在接口上使用 @Transactional 注解,但是这将只能当你设置了基于接口的代理时它才生效。...因为注解是 不能继承 的,这就意味着如果你正在使用基于类的代理时,那么事务的设置将不能被基于类的代理所识别,而且对象也将不会被事务代理所包装(将被确认为严重的)。

    47710
    领券