数据库---事务

本文介绍了数据库事务的基本概念,包括开始、结束和保存点的操作,并强调了InnoDB与MyISAM在事务支持上的区别。接着讨论了事务的四个隔离级别,以及无隔离性可能导致的脏读、不可重复读和幻读问题。最后,概述了事务的ACID特性,即原子性、一致性、隔离性和持久性,阐述了它们在保证数据库一致性和可靠性中的作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一:什么是数据库事务
数据库事务:事务是由DML(数据操作语言INSERT等)语句组成,指作为单个逻辑工作单元执行的一系列操作,这些操作要么全部成功,要么全部失败,是一个不可分割的工作单元。

事务基本操作:
1.开始事务:start transaction ;
2.结束事务: commit 或者 rollback(直接是rollback,是回到事务开始,也就是结束事务)
3.保存点:savepoint pointName
4.回到保存点:rollback to pointName

例:

mysql> create table account(
    -> id int primary key,
    -> name varchar(50) not null default '',
    -> balance decimal(10, 2) not null default 0.0
    -> );  ----默认是innodb存储引擎


mysql> start transaction;   ----开始一个事务
mysql> savepoint a;         -----设置保存点

mysql> insert into account values(1,"张三",10);   ----插入数据

mysql> savepoint b;   -----设置保存点

mysql> insert into account values(2,"李四",25);------插入数据

mysql> select * from account;
+----+------+---------+
| id | name | balance |
+----+------+---------+
|  1 | 张三 |   10.00 |
|  2 | 李四 |   25.00 |

mysql> rollback to b;  -----回到插入李四这个数据前

mysql> select * from account;
+----+------+---------+
| id | name | balance |
+----+------+---------+
|  1 | 张三 |   10.00 |
+----+------+---------+
  • 在commit之后,也就是事务已经提交,不能再设置保存点或者回滚;
  • 可以选择回到具体的保存点,直接rollback是回滚到事务开始;
  • InnoDB支持事务,MyISAM不支持事务(不支持事务指所有操作被提交)

二:事务隔离级别
当MySQL表被多个线程或者客户端开启各自事务操作数据库中的数据时,MySQL提供了一种机制,不同的事务在操作数据时,具有隔离性,保证了数据的一致性。

无隔离性的问题:
脏读 —读的数据有问题
一个事务正在访问数据,并对数据进行了修改,但是修改操作并没有提交,这时,另一个事务也访问这个数据,使用了这个数据。

如:

1.Mary的原工资为1000, 财务人员将Mary的工资改为了8000(但未提交事务)
2.Mary读取自己的工资 ,发现自己的工资变为了8000,欢天喜地!
3.而财务发现操作有误,回滚了事务,Mary的工资又变为了1000
像这样,Mary记取的工资数8000是一个脏数据。

不可重复读–update,数据值发生改变
在A事务中,多次读取同一个数据。由于同一时间,B事务对数据进行修改并提交事务,导致A事务两次读取数据不一样。即在一个事务内两次读取数据不同,称为不可重复读。

事务1和事务2同时访问数据:
1.在事务1中,Mary 读取了自己的工资为1000,操作并没有完成
2.在事务2中,这时财务人员修改了Mary的工资为2000,并提交了事务.
3.在事务1中,Mary 再次读取自己的工资时,工资变为了2000
解决办法:如果只有在修改事务完全提交之后才可以读取数据,则可以避免该问题.

幻读—insert,是数据量发生改变(一批数据)

A事务对全表操作,但B事务新插入一行数据或者删除一行数据,导致A事务产生一种幻觉,没有将全部数据进行修改。

目前工资为1000的员工有10人。
1.事务1,读取所有工资为1000的员工。
2.这时事务2向employee表插入了一条员工记录,工资也为1000
3.事务1再次读取所有工资为1000的员工 共读取到了11条记录,

解决办法:A事务提交之前,其他数据不可以添加新数据。

隔离级别

在这里插入图片描述

设置隔离级别:set session transaction isolation level read uncommitted;
查看当前隔离级别:mysql> select @@tx_isolation;

事务的ACID特性

  • 原子性(Atomicity):事务是应用中最小的执行单元
  • 一致性(Consistency):事务从一个一致性数据到另一个一致性状态,每个事务看到的数据是一样的。如果一个事务被迫发生中断,对数据库修改发生变化,但是没有提交事务导致了不一致。因此一致性是通过原子性来保证(在原子里只有失败和成功)。
  • 隔离性(Isolation):事务之间互不干扰,并发事务不能看到对方的中间状态。
  • 持久性(Durability):事务一旦提交,对数据库改变都会记录到永久存储中(磁盘)
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值