首页
学习
活动
专区
圈层
工具
发布

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;  -- 恢复自动提交

2.3K80

Mysql事物

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

2.2K40
  • 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 未提交读:说明在提交前一个事务可以看到另一个事务的变化

    2K30

    Mysql事物和锁

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

    2.5K50

    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 类。

    2.4K20

    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.9K20

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

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

    89310

    从 UML 四类事物看懂结构事物、行为事物、分组事物与构件的区别

    这四个问题,差不多正好对应题目中的四类事物。结构事物回答「系统里面有什么」。行为事物回答「系统里面发生什么」。分组事物回答「这些东西怎样组织」。注释事物回答「这些东西还需要补充说明什么」。...这样理解,四个抽象名词一下就有了非常清楚的边界。结构事物英文通常写成StructuralThings。传统UML教材喜欢把结构事物称为UML模型中的「名词」,这个比喻其实非常准确。...关键就在于考试使用的分类维度不同。题目明确给出的前提不是「UML2.5.1的语义区域怎样划分」,而是「UML中有四种事物,结构事物、行为事物、分组事物和注释事物」。...构件负责描述系统结构中的模块化组成部分。题目问的是「此类事物」,也就是前面刚刚确定的结构事物。因此答案只能是构件。这道题还可以进一步联系到程序设计语言。...检查购物车、计算价格、选择支付方式、提交支付、创建订单,这些属于动作序列。两个都属于动态行为,却观察的是不同角度。如果把这几个概念全部放回一个真实系统中,一个完整的软件模型可能同时存在这些内容。

    11710

    一篇吃透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

    1.6K171

    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 ...]

    1.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

    1.7K40

    spring的事物 原

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

    1.1K20

    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 状态,则直接提交恢复。

    1.1K10

    图解MySQL | MySQL组提交(group commit)

    前提: 以下讨论的前提 是设置MySQL的crash safe相关参数为双1: sync_binlog=1 innodb_flush_log_at_trx_commit=1 背景说明: WAL机制 (Write...相比写数据文件时的随机IO,写Redo log时的顺序IO能够提高事务提交速度。 组提交的作用: 在没有开启binlog时 Redo log的刷盘操作将会是最终影响MySQL TPS的瓶颈所在。...当开启binlog时 为了保证Redo log和binlog的数据一致性,MySQL使用了二阶段提交,由binlog作为事务的协调者。...为了再次缓解这一问题,MySQL增加了binlog的组提交,目的同样是将binlog的多个刷盘操作合并成一个,结合Redo log本身已经实现的 组提交,分为三个阶段(Flush 阶段、Sync 阶段、...binlog_group_commit_sync_delay的设置,直接开始刷盘(图中Sync binlog) Sync阶段队列的作用是支持binlog的组提交 如果在这一步完成后数据库崩溃,由于协调者

    4.7K10

    【MySQL】MySQL事务特性与自动提交

    MySQL事务特性与自动提交 又是比较偏基础理论的一篇文章,不过这也是向 MySQL 更高水平进阶的必经之路。...块,不管两人怎么来回转账,最后的总和还是 100 块 Isolation 隔离性,多个用户同时操作数据时,一个用户的操作不能被别的用户影响 Durability 持久性,事务提交了,那么改变就是永久的...事务,主要解决的就是这类问题。 事务的自动提交 既然这么好,我们需要给所有操作都使用事务吗?其实默认情况下 MySQL 是开启了自动事务提交的,你的每一个操作语句都会是一个事务。...现在我们开两个命令行窗口,在第一个命令行窗口设置 autocommit 为 OFF 。...总结 今天的内容我们就是简单地回顾一下基础,同时再演示了一下关闭 MySQL 中的事务自动提交的效果。相信大家并不过瘾,为啥呢?

    1.2K10
    领券