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

mysql 手动设置事务

基础概念

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

  1. 原子性(Atomicity):事务中的所有操作要么全部完成,要么全部不完成,不会停留在中间状态。
  2. 一致性(Consistency):事务执行前后,数据库必须保持一致状态。
  3. 隔离性(Isolation):并发执行的事务之间不能相互干扰。
  4. 持久性(Durability):一旦事务提交,其结果就是永久性的。

手动设置事务

在MySQL中,可以通过以下命令手动设置事务:

代码语言:txt
复制
START TRANSACTION;
-- 执行SQL语句
COMMIT; -- 提交事务
-- 或者
ROLLBACK; -- 回滚事务

优势

  1. 数据一致性:通过事务,可以确保多个SQL语句要么全部成功,要么全部失败,从而保持数据的一致性。
  2. 并发控制:事务可以隔离并发操作,防止数据冲突和不一致。
  3. 错误恢复:如果事务中的某个操作失败,可以通过回滚事务来撤销所有已执行的操作,恢复到事务开始前的状态。

类型

MySQL支持多种事务隔离级别,包括:

  1. READ UNCOMMITTED
  2. READ COMMITTED
  3. REPEATABLE READ
  4. SERIALIZABLE

默认情况下,MySQL使用REPEATABLE READ隔离级别。

应用场景

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

  1. 银行转账:确保从一个账户扣除金额和向另一个账户增加金额的操作是原子的。
  2. 订单处理:确保订单创建、库存更新和支付处理等操作要么全部成功,要么全部失败。
  3. 数据备份和恢复:在备份和恢复数据时,确保数据的完整性和一致性。

常见问题及解决方法

问题1:事务超时

原因:事务执行时间过长,超过了数据库设置的超时时间。

解决方法

代码语言:txt
复制
SET SESSION innodb_lock_wait_timeout = 120; -- 设置锁等待超时时间为120秒

问题2:死锁

原因:两个或多个事务互相等待对方释放资源,导致死锁。

解决方法

  1. 自动检测并回滚:MySQL会自动检测死锁并回滚其中一个事务。
  2. 优化事务逻辑:减少事务的持有时间,避免长时间锁定资源。

问题3:事务隔离级别设置不当

原因:选择了不合适的隔离级别,导致并发问题。

解决方法

根据具体需求选择合适的隔离级别,例如:

代码语言:txt
复制
SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;

参考链接

MySQL事务详解

MySQL事务隔离级别

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

相关·内容

springboot手动控制mysql事务

platformTransactionManager; @Resource private TransactionDefinition transactionDefinition; 开启事务...代码 完全符合我们之前的那份代码片段,有事务,也有锁 触发了代码之后,库存为 0 了,没有问题。 但是,订单居然有 20 笔!...我们的逻辑 代码运行的逻辑 在上面的示例代码的情况下,事务的提交在方法运行结束之后。 你细品,这个描述是不是迷惑性就没有那么强了,甚至你还会恍然大悟:这不是常识吗?...注意 Transactional失效场景介绍失效场景介绍 第一种 非public方法 第二种 内部方法调用 第三种 异常未抛出 结语 当然这里也有其他的解决方案,但是我推荐还是手动开启事务...,手动提交事务, 再者就是重新创建一个类专门加锁,另一个类专门控制事务,就可以用Transactional 注解

3.1K10

mysql设置隔离级别_修改mysql事务隔离级别

引言 开始我们的内容,相信大家一定遇到过下面的一个面试场景 面试官:“讲讲mysql有几个事务隔离级别?” 你:“读未提交,读已提交,可重复读,串行化四个!...Mysql默认的事务隔离级别是可重复读(Repeatable Read),那互联网项目中Mysql也是用默认隔离级别,不做修改么?...项目中是不用读未提交(Read UnCommitted)和串行化(Serializable)两个隔离级别,原因有二 采用读未提交(Read UnCommitted),一个事务读到另一个事务未提交读数据,...采用串行化(Serializable),每个次读操作都会加锁,快照读失效,一般是使用mysql自带分布式事务功能时才使用该隔离级别!...(笔者从未用过mysql自带的这个功能,因为这是XA事务,是强一致性事务,性能不佳!互联网的分布式方案,多采用最终一致性的事务解决方案!)

3.7K10
  • 事务手动提交和XA事务问题及思考

    一、背景 今天@无聊之园提出 一个问题 “手动将多个数据库事务提交和XA效果类似,比如事务A,事务B一起提交,前面报错就一起回滚,否则一起先后执行提交”。除非是提交的时候会有失败的可能,否则没有问题。...2.3 事务被kill 之前开发的时候公司运维系统对超过某个执行时间的线程就会kill掉。 假如这个时候第一个事务提交成功后第二个事务还没来得及提交就被kill,显然也会提交失败。...因此手动多个事务一起提交不太靠谱,无法可靠的保证事务的一致性。...三、延伸 3.1 XA事务相关好文 《XA 事务处理》https://www.infoq.cn/article/xa-transactions-handle 对XA事务给出了详细的讲解。...X/Open XA 接口是双向的系统接口,在事务管理器以及一个或多个资源管理器之间形成通信桥梁。 事务管理器控制着 JTA 事务,管理事务生命周期,并协调资源。

    1.1K30

    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

    3.4K10

    mysql事务

    HOW mysql-demo 事务commit成功 -- 事务commit成功 BEGIN; update jwentest set balance = balance - 10 where id=1;...,该mysql连接(或者说进程)把数据库表lock住了 同理ROLLBACK操作一次: -- 窗口A BEGIN; update jwentest set balance = balance -.../jkko123/p/10184532.html 没有手动commit,直接关闭窗口(断开连接) 手动commit 没有手动commit,直接新开事务,新开事务会自动提交会话中的事务 可不可报错了后自动回滚呢...可以,需要设置,请参考: https://www.cnblogs.com/ajianbeyourself/p/6956417.html 相关查询 先查看表是不是支持事务,innodb支持事务 SELECT...在MySQL中,如果使用InnoDB,默认的隔离级别是Repeatable Read。 Read Uncommitted是隔离级别最低的一种事务级别。

    3.7K20

    MySQL 事务

    在 **InnoDB** 存储引擎中的事务默认情况下是开启自动提交的,所以在下面的 **update SQL** 语句是自动开启了一个事务并提交,最终写入到了磁盘;当设置 **autocommit =...false** 时,数据库的事务需要手动地区开启与结束。...手动开启事务有 **begin | start transaction** 方式,手动结束事务有 **commit | rollback**** **方式;在回滚时和当客户端的连接断开时,事务也会结束。...MySQL InnoDB 中对隔离级别的支持 在 **MySQL** 中的 **InnoDB** 存储引擎支持的隔离级别与 **SQL92** 定义的基本一致,隔离级别越高,事务的并发度就越低。...**Gap Lock** 只是在 **RR** 中存在,如果要关闭间隙锁就是把事务隔离级别设置成 **RC** 且设置 **innodb_locks_unsafe_for_binlog = ON**

    4K20

    MySQL 事务

    在MySQL中,事务具有以下四个特性,通常称为ACID特性: 1.原子性(Atomicity):事务中的所有操作要么全部执行成功,要么全部失败。...在MySQL中,可以使用以下命令来控制事务: •START TRANSACTION; or BEGIN;:开始一个新的事务。•COMMIT;:提交当前事务,使事务中的所有修改生效。...MySQL支持以下四种事务隔离级别: 1.未提交读(Read Uncommitted):允许一个事务读取另一个事务未提交的数据。这可能导致脏读、不可重复读、幻读。...查看、设置MySQL事务隔离级别 -- 查看事务隔离级别 -- 使用系统变量查询 SELECT @@transaction_isolation; -- 5.7.20之前 SHOW VARIABLES...LIKE '_isolation'; -- 5.7.20之后版本 SHOW VARIABLES LIKE 'transaction_isolation'; -- 设置事务隔离级别 SET [GLOBAL

    1.1K10

    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

    3K40

    MySQL事务

    隔离性:一个事物在最终提交之前,数据的改变对其他事务是不可见的。 持久性:事务的最终操作结果能被持久保存。 MySQL事务 接下来我们介绍MySQL中的事务是如何保证ACID特性的。...(以下不做特殊说明,都默认InnoDB引擎) 原子性: 我们在MySQL中可以使用以下语句开启一个事务: BEGIN / START TRANSACTION (START TRANSACTION还可以指定只读事务和读写事务...如果执行commit的话,MySQL把最终结果刷到磁盘中。为了保证事务执行中,异常宕机导致事务仍可回滚,undo log的数据也是会被持久化到磁盘的。...如果一些比较大的事务undo内存缓存失效时,回滚操作可能会伴随大量的磁盘IO。 一致性: MySQL中的一致性主要包括,数据在任何时候状态都是一致的。...InnoDB是以页为单位存储数据的 Page Size默认16KB EXT家族文件系统的IO最小单元通常设置为1KB 2KB 或者4KB(传送门) 磁盘的最小IO是一个扇区:512字节 因此再写一页数据时

    2.8K20

    MySQL(事务)

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

    2.8K10

    MySQL·事务

    MySQL 默认采用自动提交模式,对于单条 SQL 语句,数据库系统自动将其作为一个事务执行,这种事务被称为隐式事务。...要手动把多条 SQL 语句作为一个事务执行,使用 BEGIN 开启一个事务,使用 COMMIT 提交一个事务,这种事务被称为显式事务,例如,把上述的转账操作作为一个显式事务: BEGIN; UPDATE...分别开启两个 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;

    2.7K10

    【MySQL】事务

    五、事务常见操作方式 1. 准备工作 设置隔离级别 我们将隔离级别设置成最低是为了方便我们观察现象。 为了便于演示,我们将 mysql 的默认隔离级别设置成读未提交。...(3)begin 操作会自动更改提交方式,不会受MySQL是否自动提交影响 我们上面手动启动一个事务并不会受 MySQL 是否自动提交影响,例如我们现在把自动提交关掉: 我们再启动一个事务,插入数据等,...(4)单条 SQL 与事务的关系 我们知道,当我们启动一个事务的时候删除一个数据再手动 commit 之后,数据一定会被删除。...需要我们手动提交才能保存数据!下面我们验证一下是否需要我们手动提交: 如上,我们手动 commit 后数据确实被删除了!...; 事务可以手动回滚,同时,当操作异常,MySQL 会自动回滚; 对于 InnoDB 每一条 SQL 语言都默认封装成事务,自动提交(select 有特殊情况,因为 MySQL 有 MVCC ); 从上面的例子

    2.1K10

    Mysql事务

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

    1.6K10

    Mysql事务

    事务 简单来说,事务就是操作一系列事件,要么全部完成,要么全部不完成。...账号2 人民币50元 public static void main(String[] args) throws SQLException { String url = "jdbc:mysql...,不可重复读,虚读 Serializable隔离级别下的事务具有最高的安全性,但是,由于事务是串行执行,所以效率会大大下降 建议细看:事务隔离级别的图文 脏读:一个事务读取到另外一个事务未提交的数据...丢失修改:两个事务同时访问数据,第一个修改数据后,第二个也修改数据,导致第一个修改数据丢失 不可重复读:第一个事务读取到数据后,另外一个事务修改数据并提交后第一个事务再次读取,第一个事务两次读取的数据不一样...查看与修改事务级别 //查看当前事物级别: SELECT @@tx_isolation; //设置事务级别 SET [SESSION|GLOBAL] TRANSACTION ISOLATION LEVEL

    2.2K20
    领券