<MySQL> 什么是数据库事务?事务该如何使用?

目录

一、事务的概念

二、事务的核心特性

三、事务操作中的常见BUG

[3.1 脏读](#3.1 脏读)

[3.2 不可重复读](#3.2 不可重复读)

[3.3 幻读](#3.3 幻读)

四、隔离级别

五、使用事务


一、事务的概念

"事务"是指一组操作,在逻辑上是不可分割的,组成这组操作的各个语句,或者全部执行成功,或者全部执行失败。

不同的环境对"事物"这一概念有不同的称呼,在数据库中,这个概念就被称为"数据库事务"。


二、事务的核心特性

++事物具有以下特性:++

|----------|----------------------------------------------------|
| 核心特性 | 说明 |
| 原子性 | 通过事物,将多条语句组合在一起,使这些语句在执行的时候不可被分割。 |
| 一致性 | 事务中的各个操作语句,或者全部执行成功,或者全部执行失败,保持了执行结果的一致。 |
| 持久性 | 事务本身也是由操作语句组成的,每一条执行成功的语句带来的数据修改都是持久化存在的。 |
| 隔离性 | 用于解决多事务并发执行时可能出现的BUG,隔离性提高了数据的准确性,但降低了程序的运行速度。 |


三、事务操作中的常见BUG

3.1 脏读

|------|-------------------------------------------------------------------------|
| 介绍 | 脏读,就像名字一样,意思是读到的数据是脏的,是被污染的。脏读是由于数据库中的数据没有被正确地更新,导致在事务提交时读取的数据是错误的。 |
| 举例 | 事务1持续更新数据A,在事务1未更新完毕时,事务2读取了数据A。此时数据A仍然在被事务1改动,那么事务2读取的数据就是一个错误的数据。 |
| 解决方案 | 降低事务的并发,当发生写操作时,其他事务不能读,直到写操作执行完毕。(写的时候不能读) |

3.2 不可重复读

|------|----------------------------------------------------------------------------------|
| 介绍 | 不可重复读是由于数据库中的数据虽然被正确地更新,但是因为在读的过程中发生并发访问,导致数据再次被更新,此时事务就根据读取的错误数据提交了。 |
| 举例 | 事务1更新数据A,并正常提交。事务2开始读操作,多次读取数据A。但发生了并发访问,事务3再次更新数据A。此时事务2还在持续读取数据A,但得到的数据已经发生改变。 |
| 解决方案 | 降低事务的并发,当发生读操作时,其他事务不能写,直到读操作执行完毕。****(读的时候不能写) |

3.3 幻读

|------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 介绍 | **幻读和不可重复读十分相似,都是在读数据的过程中,数据发生改变而导致读取的数据前后不一致,只是幻读获得的错误数据规模更大,比如幻读带来了错误的结果集。**个人粗略的认为幻读是不可重复读的进阶版。 |
| 举例 | 事务1更新数据A,并正常提交。事务2开始读操作,多次读取包含数据A在内的数据集合,并根据数据集合进行了各种运算,产生了结果集。事务3并发访问将数据A删除了,此时事务2读取的数据集合就不包括数据A了,那么此时事务2完成提交后得到的结果集就与第一次不同了,就好像产生了幻觉一样(通俗来讲就是,"见了鬼了怎么两次得到的结果不一样?")。 |
| 解决方案 | 通常采用串行化的事务执行方式,即不再发生任何并发。 |


四、隔离级别

从上文可以得知,使用事务时可能出现一些BUG。虽然出现了BUG,但一般都会有相应的解决方法,而MySQL中也提供了一些"锦囊妙计"来帮助使用者避免BUG,这就是隔离级别

++MySQL提供了四种隔离级别:++

|----------------------|-------------------------------|----------|----------|--------|-----------|-----------------|
| 隔离级别 | 说明 | 并行程度 | 隔离程度 | 效率 | 数据准确度 | 可能出现的BUG |
| read uncommitted | 读未提交。没有任何限制。 | 最高 | 最低 | 最高 | 最不准确 | 脏读、不可重复读、幻读 |
| read commited | 读已提交。写操作加锁。 | | | | 不准确 | 不可重复读、幻读 |
| repeatable read | 可重复读,默认的隔离级别。读操作加锁,写操作加锁。 | | | | 准确 | 幻读 |
| serializable | 串行化。读操作加锁,写操作加锁。 | 不并行 | 最高 | 最低 | 最准确 | |

以上四种隔离级别供使用者根据需求进行使用和调整,以适应不同情况。 越往下隔离级别越高,隔离级别高能够带来准确的数据,但同时会导致程序执行效率变低,这就需要程序员根据不同的实际情况进行取舍了。


五、使用事务

++使用事务的步骤:++

|-------------|------------------------------|
| 开启事务 | start transaction; |
| 打包SQL语句 | 由多条SQL语句组成一个逻辑上的不可分割的整体; |
| 回滚或提交 | rollback/commit; |

++回滚(rollback):++是指在事务提交时,如果发生错误,可以回滚到事务开始时,撤销所有已经执行的SQL语句。回滚可以用于确保数据的一致性,避免数据不一致的情况。使用Java进行编程时, rollback 一般会在代码里抛出异常,cry/catch 捕获时使用。简单来讲,回滚代表SQL全部执行失败。

++提交(commit):++是指在事务完成时,可以确认所有SQL语句都已经成功执行,确认将事务的数据写入到数据库中。简单来讲,提交代表SQL全部执行成功。


阅读指针 -> 《JDBC编程》

链接生成中.........

相关推荐
尘浮生4 分钟前
Java项目实战II基于SpringBoot的客户关系管理系统(开发文档+数据库+源码)
java·开发语言·数据库·spring boot·后端·微信小程序·小程序
晚风_END8 分钟前
postgresql|数据库开发|python的psycopg2库按指定顺序批量执行SQL文件(可离线化部署)
服务器·开发语言·数据库·python·sql·postgresql·数据库开发
桃园码工26 分钟前
2-测试bigcache做进程内缓存 --开源项目obtain_data测试
vscode·mysql·go·postman
晴子呀27 分钟前
Redis除了做缓存,还能做什么???
数据库·redis·缓存
sxy1993sxy201828 分钟前
数据库和缓存的数据一致性 -20241124
数据库·缓存
hxj..29 分钟前
【中间件】Redis
数据库·redis·缓存·中间件
孙克旭_30 分钟前
第四章 Redis多级缓存案例
数据库·redis·缓存
九河云1 小时前
分布式数据库中间件可以用在哪些场景呢
数据库·分布式·中间件·华为云
白云如幻1 小时前
MySQL子查询介绍和where后的标量子查询
数据库·mysql
小玉起起2 小时前
Redis Key 命名规范文档
数据库·redis·缓存