我的编程空间,编程开发者的网络收藏夹
学习永远不晚

MySQL 事务

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

MySQL 事务

目录

什么是事务

为什么要使用事务

事务优点

总结事务命令

详细解释:


什么是事务

多条 sql 语句,要么全部成功,要么全部失败。 MySQL 的事务是在存储引擎层实现。 MySQL 的事务有 ACID A 原子性 (atomicity) :一个事务必须被视为一个不可分割的单元。 C 一致性 (consistency) :数据库是从一种状态切换到另一种状态。 I 隔离性 (isolation) :事务在提交之前,对于其他事务不可见。 D 持久性 (durablity) :一旦事务提交,所修改的将永久保存到数据库。
mysql> CREATE TABLE bank -> ( -> name VARCHAR(25), -> MONEY FLOAT -> ); Query OK, 0 rows affected (0.04 sec)mysql> insert into bank(name,MONEY) values('lu','1000'),('qi','5000');Query OK, 2 rows affected (0.00 sec)Records: 2 Duplicates: 0 Warnings: 0Begin 或 start transaction开启事务mysql> BEGIN;Query OK, 0 rows affected (0.00 sec)mysql> UPDATE bank SET MONEY=MONEY-1000 WHERE name='qi';Query OK, 1 row affected (0.06 sec)Rows matched: 1 Changed: 1 Warnings: 0mysql> UPDATE bank SET MONEY=MONEY+1000 WHERE name='lu';Query OK, 1 row affected (0.00 sec)Rows matched: 1 Changed: 1 Warnings: 0mysql> SELECT * FROM bank;+------+-------+| name | MONEY |+------+-------+| lu | 2000    || qi | 4000    |+------+-------+2 rows in set (0.00 sec)mysql> mysql> ROLLBACK;Query OK, 0 rows affected (0.00 sec)mysql> SELECT * FROM bank;+------+-------+| name | MONEY |+------+-------+| lu | 1000    | qi | 5000    |+------+-------+2 rows in set (0.00 sec)mysql> commit;Query OK, 0 rows affected (0.00 sec)mysql> SELECT * FROM bank;+------+-------+| name | MONEY |+------+-------+| lu | 1000    || qi | 5000    |+------+-------+2 rows in set (0.00 sec)|

为什么要使用事务

  1. 数据完整性:事务是确保数据在数据库中保持一致性和完整性的关键机制之一。通过使用事务,可以将多个操作作为一个原子操作来执行,要么全部执行成功,要么全部回滚到事务开始之前的状态,从而保证数据的完整性。

  2. 并发控制:当多个用户同时访问数据库时,可能会发生并发冲突,比如多个用户同时修改同一行数据。事务可以在并发环境中提供隔离性,确保每个事务独立运行,不受其他事务的干扰。通过对事务的隔离性进行管理,可以避免脏读、不可重复读和幻读等并发访问问题,确保数据的一致性。

  3. 数据回滚和恢复:当发生错误或异常情况时,事务可以实现数据的回滚和恢复。如果事务执行过程中出现错误,可以回滚到事务开始之前的状态,避免对数据库造成不可逆的影响。而且在系统故障或断电等意外情况下,事务的持久性保证了数据的持久存储,确保数据不会丢失。

  4. 性能优化:使用事务可以减少频繁的数据库操作和通信开销。将多个操作合并为一个事务,在服务器端一次性执行,可以减少与数据库的交互次数,提高数据库的性能和吞吐量。

总的来说,使用MySQL事务可以提供数据的一致性、并发控制、数据回滚和恢复的功能,保障数据的正确性和可靠性,并提高数据库的性能和效率。

事务优点

  1. 原子性(Atomicity):事务是一个原子操作,将数据库从一个一致状态转变为另一个一致状态。如果事务的所有操作成功执行,则事务被提交(Commit),否则将被回滚(Rollback)到事务开始前的状态。这确保了数据库的完整性,能够保证数据的一致性。

  2. 一致性(Consistency):事务的执行将数据库从一个一致状态转变为另一个一致状态。在事务开始之前和结束之后,数据库始终保持一致的状态。如果事务执行期间出现错误或违反了约束条件,事务将被回滚,数据库将恢复到事务开始之前的状态。

  3. 隔离性(Isolation):事务的隔离性指的是并发执行的事务之间互不干扰,每个事务的中间状态对其他事务是不可见的。MySQL使用锁机制来保证事务的隔离性,避免了脏读、不可重复读和幻读等并发访问问题。

  4. 持久性(Durability):当事务提交后,它的修改将永久保存在数据库中,即使发生系统故障或断电等异常情况也不会丢失。MySQL使用日志(log)来保证事务的持久性,将事务的操作记录到日志中,在系统恢复后可以通过日志重新执行来还原事务。

事务的使用能够确保数据库操作的可靠性和一致性,尤其是在并发操作的情况下能够有效地保护数据的完整性,并提高系统的性能和并发能力。

总结事务命令

事务开始: start transaction 事务开始: begin 事务提交: commit 回 滚: rollback 查看自动提交模式是自动还是手动 事务有 4 种隔离级别 事务在提交之前对其他事务可不可见 1. read unaommitted( 未提交读 ) 2. read committed( 已提交读 ) 3. Repeatable read( 可重复读 ) 4. seaializable( 可串行化 )
mysql> SHOW VARIABLES LIKE 'AUTOCOMMIT';+---------------+-------+| Variable_name | Value |+---------------+-------+| autocommit | ON       |+---------------+-------+1 row in set (0.01 sec)mysql> SET AUTOCOMMIT=0;Query OK, 0 rows affected (0.00 sec)mysql> SHOW VARIABLES LIKE 'AUTOCOMMIT';+---------------+-------+| Variable_name | Value |+---------------+-------+| autocommit | OFF      |+---------------+-------+1 row in set (0.00 sec)

详细解释:

未提交读 事务中修改没有提交对其他事务也是可见的,俗称脏读
mysql> CREATE TABLE student -> ( -> id int not null auto_increment, -> name varchar(32) not null default '', -> primary key(id) -> )engine=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;Query OK, 0 rows affected (0.13 sec)
两端的客户端都设置成未提交读
mysql> SET SESSION TX_ISOLATION='READ-UNCOMMITTED';Query OK, 0 rows affected (0.00 sec)
客户端 A
mysql> BEGIN;Query OK, 0 rows affected (0.00 sec)mysql> SELECT * FROM student;Empty set (0.00 sec)mysql> INSERT INTO student(name) values('zhangyi');Query OK, 1 row affected (0.00 sec)mysql> //注意:此时事务未提交!!!
客户端 B
mysql> set session tx_isolation='read-uncommitted';Query OK, 0 rows affected (0.01 sec)mysql> select * from student;+----+---------+| id | name |+----+---------+| 2 | zhangyi |+----+---------+1 row in set (0.00 sec)
客户端 B 可以查看到信息
总结: 以上可以看出未提交读隔离级别非常危险,对于一个没有提交事务所做修改对另一个事务是可见状态,出现了脏读!非特殊情况不建议使用此级别
已提交读 多数数据库系统默认为此级别( MySQL 不是)。已提交读级别为一个事务只能已提交事务所做的修改,也就是解决了未提交读的问题
mysql> SET SESSION TX_ISOLATION='READ-COMMITTED';Query OK, 0 rows affected (0.00 sec)mysql> BEGIN;Query OK, 0 rows affected (0.00 sec)mysql> SELECT * FROM student;+----+---------+| id | name |+----+---------+| 2 | zhangyi |+----+---------+1 row in set (0.00 sec) //此时去另一个客户端去查看mysql> INSERT INTO student(name) values ('zhanger');Query OK, 1 row affected (0.00 sec)mysql> COMMIT;Query OK, 0 rows affected (0.01 sec)
客户端 B
mysql> select * from student;+----+---------+| id | name |+----+---------+| 2 | zhangyi |+----+---------+1 row in set (0.00 sec) //未提交的时候查看mysql> select * from student;+----+---------+| id | name |+----+---------+| 2 | zhangyi || 3 | zhanger |+----+---------+2 rows in set (0.00 sec) //已提交事务之后查看
总结: 从上面的例子可以看出,提交读没有了未提交读的问题,但是我们可以看到客户端 A 的一个事务中执行了两次同样的SELECT 语句,,得到不同的结果,因此已提交读又被称为不可重复读。同样的筛选条件可能得到不同的结果
可重复读 -- 解决了不可重复读的问题,数据库级别没有解决幻读的问题
mysql> SET SESSION TX_ISOLATION='REPEATABLE-READ';Query OK, 0 rows affected (0.00 sec) //两个客户端均设置为可重复读
然后两边一起开启一个事务 客户端 A
mysql> begin;Query OK, 0 rows affected (0.00 sec)mysql> select * from student;+----+---------+| id | name |+----+---------+| 2 | zhangyi || 3 | zhangsi |+----+---------+2 rows in set (0.00 sec)mysql> UPDATE student SET name='zhanger' WHERE id=3;Query OK, 1 row affected (0.02 sec)Rows matched: 1 Changed: 1 Warnings: 0mysql> COMMIT;Query OK, 0 rows affected (0.06 sec)
客户端 B
mysql> begin;Query OK, 0 rows affected (0.00 sec)mysql> select * from student;+----+---------+| id | name |+----+---------+| 2 | zhangyi || 3 | zhangsi |+----+---------+2 rows in set (0.00 sec)mysql> select * from student;+----+---------+| id | name |+----+---------+| 2 | zhangyi || 3 | zhangsi |+----+---------+2 rows in set (0.00 sec)mysql> COMMIT;Query OK, 0 rows affected (0.00 sec)mysql> select * from student;+----+---------+| id | name   |+----+---------+| 2 | zhangyi || 3 | zhanger |+----+---------+2 rows in set (0.00 sec)
总结: 上面的例子我们得知,可重复读两次读取的内容不一样。数据库的幻读问题并没有得到解决。幻读只读锁定里面的数据,不能读锁定外的数据,解决幻读出了mvcc 机制 Mvcc 机制。 可串行化--是最高隔离级别,强制事务串行执行,执行串行了也就解决问题了,这个I别只有在对数据一致性要求非常严格并且没有并发的情况下使用
mysql> SET SESSION TX_ISOLATION='SERIALIZABLE';Query OK, 0 rows affected (0.00 sec) //客户端两边设置成可串行读
客户端 A
mysql> begin ;Query OK, 0 rows affected (0.00 sec)mysql> select * from student where id < 10;+----+---------+| id | name |+----+---------+| 2 | zhangyi || 3 | zhanger || 4 | zhangwu || 5 | zhangwu || 6 | zhangwu || 7 | zhangqi |+----+---------+6 rows in set (0.00 sec)
客户端 B
mysql> insert into student (name) values('zhangqi');ERROR 1205 (HY000): Lock wait timeout exceeded; trying transaction
总结: 我们发现 INSERT 语句被阻塞执行,原因是 A 执行了查询表 student 同时满足 id<10 ,已被锁定。如果查询表student 同时满足 id<5 ,则新增语句可以正常执行
隔离级别 脏读 不可重复 幻读 加锁读
未提交读
提交读
可重复读
串行读

来源地址:https://blog.csdn.net/2301_78341899/article/details/131849086

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

MySQL 事务

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

MySQL事务。

相关资料:https://zhuanlan.zhihu.com/p/70701037        https://zhuanlan.zhihu.com/p/59061106一、事务。  1、概念。事务是由一组SQL语句组成的逻辑处理单元。  2、事务的属性(
2018-12-10

MySQL—事务

MySQL—事务 🔎定义🔎事务的特性原子性一致性持久性隔离性 🔎并发执行事务可能产生的问题脏读不可重复读幻读总结 🔎MySQL—事务的隔离级别 ǵ
2023-08-16
2023-09-09

mysql-事务

1.事务(transaction)事务是业务逻辑的一个基本的单元组成。每一个事务由一条条sql语句组成。和事务相关的语句(insert,delete,update)这些DML语句事务的存在保证了数据的安全性。事务机制:每一次执行DML语句都会记录操作,但不会修
mysql-事务
2019-08-05

【MySQL】事务

文章目录 1. 前言2. 事务简介3. 事务操作4. 事务四大特性5. 并发事务的问题6. 事务隔离级别7. 总结 1. 前言 事务是数据库管理系统中非常重要的概念,本文主要介绍的是事务的四大特性,并发事务可能引发的问题以及事务
2023-08-17

MySQL事务

一、事务的概念事务就是一组原子性的SQL查询,或者说一个独立的工作单元。如果数据库引擎能够成功地对数据库应用该组查询的全部语句,那么就执行该组查询。如果其中有任何一条语句因为崩溃或其他原因无法执行,那么所有的语句都不会执行。也就是说,事务内的语句,要么全部执行
MySQL事务
2022-01-22

MySQL——事务

事务:指一组SQL语句 回滚:指撤销指定SQL语句的过程 提交:将未存储的SQL语句结果写入数据库表 保留点:事务处理过程中设置的临时占位符,可以对它发布回退 事务的四大特性 原子性:事务中所有的操作是不可再分割的原子单位。事务中所有操作要么全部执
MySQL——事务
2018-05-27
2024-04-02
2024-04-02

MySQL事务学习

MySQL事务:1、事务特性:原子性,一致性,隔离性,持久性原子性:对一些操作,要么同时成功,要么同时失败。一致性:对一些操作,处理结果必须一致的,比如转账:A转给B,那么A账户减少100元,则B账户必须增加100元。隔离性:多个事务操作数据的表或者行,如果没
MySQL事务学习
2019-11-20

MySQL的本地事务、全局事务、分布式事务

本地事务事务特性:ACID,其中C一致性是目的,AID是手段。实现隔离性写锁:数据加了写锁,其他事务不能写也不能读。读锁:数据加了读锁,其他事务不能加写锁可以加读锁,可以允许自己升级为写锁。范围锁:对某个范围加写锁,范围内数据不能写入。隔离级别以锁为手段来实现
MySQL的本地事务、全局事务、分布式事务
2019-01-19

Mysql事务原理

一、什么是事务事务:是数据库操作的最小工作单元,是作为单个逻辑工作单元执行的一系列操作;这些操作作为一个整体一起向系统提交,要么都执行、要么都不执行;事务是一组不可再分割的操作集合(工作逻辑单元);事务的四大特性:原子性(Atomicity):事务是数据库的逻
Mysql事务原理
2020-08-23

MySQL 事务管理

事务的4个特性(ACID)原子性 Atomicity。每个事务中的操作,要么都成功,要么都失败一致性 Consistency。事务执行前后,数据库中的数据应该保持一致隔离性 Isolation。事务之间应该是隔离的,事务之间互不影响、干扰持久性 Durabil
MySQL 事务管理
2015-09-09

MySQL事务介绍

什么是事务事务的概念从业务层面上来说,事务就是一个最小的不可分割的单元,通常一个事务对应的是一个完整的业务(比如银行的转账操作)。为什么要有事务仍以银行转账为例加以说明,比如我要从账号A转账100元到账号B,现在数据库有一张表account,那么就意味着需要同
MySQL事务介绍
2019-11-07

MySQL事务处理

概述在MySQL中只有使用了InnoDB数据库存储引擎的数据库或表才支持事务。事务处理可以用来维护数据库的完整性,保证成批的SQL语句要么全部成功,要么全部失败。事务用来管理DDL、DML、DCL操作,比如:insert、update、delete语句,默认是
MySQL事务处理
2014-12-03

mysql事务详解

事务的特性(Atomicity) 原子性 -- 回滚日志一个事务(transaction)中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节。事务在执行过程中发生错误,会被回滚(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一
mysql事务详解
2016-12-01

编程热搜

目录