十一、事务

本文详细介绍了数据库事务的ACID特性,包括原子性、一致性、隔离性和持久性。通过实例展示了事务的提交与回滚操作,以及在不同事务隔离级别下可能出现的脏读、不可重复读和幻读问题。同时,提供了查看和设置MySQL事务隔离级别的方法。

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

数据库事务( transaction)是访问并可能操作各种数据项的一个数据库操作序列,这些操作要么全部执行, 要么全部不执行,是一个不可分割的工作单位。事务由事务开始与事务结束之间执行的全部数据库操作组成

事务是由一组SQL语句 组成的逻辑处理单元,它的ACID特性如下:

(1) 原子性(Atomicity):事务具有原子不可分割的特性,要么一起执行,要么都不执行。

(2) 一致性(Consistency):在事务开始和事务结束时,数据都保持一致状态。

(3) 隔离性(Isolation):在事务开始和结束过程中,事务保持着一定的隔离特性,保证事务不受外部并发数据操作的影响。

(4) 持久性(Durability):事务完成后,数据将会被持久化到数据库中。

 事务有两状态一个是提交【commit】,一个是回滚【rollback】。

BEGIN ; -- 开启事务 提交 commit或 回滚rollback
UPDATE account SET abalance=abalance-2000 WHERE aid=1;
UPDATE account SET abalance=abalance+2000 WHERE aid=2;
COMMIT;
或
ROLLBACK;

还可以设置打点事务,即再保存点之前的会提交,保存点之后的会回滚

START TRANSACTION ;
UPDATE account SET abalance=abalance-10 WHERE aid=1;
SAVEPOINT A;
UPDATE account SET abalance=abalance-1000 WHERE aid=1;
UPDATE account SET abalance=abalance+1000 WHERE aid=2;
ROLLBACK TO A;

事务隔离级别:一个事务对数据库修改与并行的另一个事务的隔离程度。 两个并发事务同时访问数据库表相同的行时,可能存在以下三个问题:

1、幻想读,2、不可重复读取 ,3、脏读

为了处理这些问题,SQL标准定义了以下几种事务隔离级别

脏读不可重复读幻读
Read uncommitted
Read committed×
Repeatable read××
Serializable×××

脏读:事务A读取到事务B未提交的数据。

        比如账号1的账号金额是5000,此时事务B,将1账号的金额更改为8000,但是还未提交事务,此时事务A,查看1账号的金额,看到8000,然后事务B对操作做了回滚。事务A就读取到脏数据。

        如果将事务的隔离级别提高到Read uncommitted,便不会产生以上情况。

不可重复读:事务A查看1账号的金额是2000,此时想再账号上减2000.但是还没操作的时候,事务B,将数据更改了,并再事务A之前提交了事务。此时事务A再次读取该数据的时候,已经改变了。

         事务的隔离级别提高到Read committed时,避免了脏读,但是会造成不可重复度。大多数数据库 的默认级别就是ReadCommited.可以将事务的隔离级别提高到Repeatable read。也就是事务A读取了数据,再未提交事务的时候,事务B不能对数据进行修改。

幻读:事务A查看第一次查看记录的时候为80。此时,事务B对该记录做了更改,事务A再看的时候,发现不是80,事务A就像出现环境一样。将隔离级别提高到Serializable就可以避免幻读。

查看mysql的事务隔离级别

SELECT @@transaction_isolation; [select @@tx_isolation;]

设置mysql的事务隔离级别

SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ;

脏读:事务A读取到事务B未提交的数据。脏数据所指的就是未提交的数据 设置事务A与事务B的隔离级别为Read uncommitted;

事务A[事务A读取到的8000就是脏数据]事务B
READ UNCOMMITTED;READ UNCOMMITTED;
select * from account ;-- 5000select * from account;--5000
begin;
update account set balance=8000 where accid=1;
select * from account ;-- 8000
rollback

 操作:事务A和事务B都设置事务的隔离级别为READ UNCOMMITTED;

事务B开启事务,并更新记录为8000,此时并未提交

事务A查看数据,看到了8000的结果。

事务B又做了回滚,此时事务A读取到的8000,就属于

不可重复读:一个事务先后读取同一条记录,而事务在两次读取之间该数据被其它事务所修改,则两次读取的数据不同,我们称之为不可重复读。 设置事务A与事务B的隔离级别为Read committed;

事务A事务B
READ COMMITTED;READ COMMITTED;
select * from account ;-- 5000select * from account;--5000
begin;
update account set balance=balance+3000 where accid=1;
COMMIT;
begin;
update account set balance=balance+3000 where accid=1;
COMMIT;
select * from account;-- 11000??select * from account;-- 8000

幻读:一个事务按相同的查询条件重新读取以前检索过的数据,却发现其他事务插入了满足其查询条件的新数据,这种现象就称为幻读。

设置事务A与事务B的隔离级别为REPEATABLE READ;

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值