【MySQL自学记录】事务

目录

一、事务的概念及特性:

1、原子性:

2、一致性:

3、隔离性:

4、持久性:

二、事务并发问题:

1、脏读(Dirty read):

2、不可重复读:

3、幻读:

三、事务的隔离级别:


一、事务的概念及特性:

事务:是指一个操作序列,该操作序列中的多个操作要么做要么不做,是一个不可分割的工作单位,是数据库环境中的逻辑工作单位,由数据库管理系统中的事务管理子系统负责事务的处理。用来维护数据库完整性,它能够保证一系列的MySQL操作要么全部执行,要么全部不执行。

事务的特性:事务处理可以确保除非事务性序列内的所有操作都成功完成,否则不会永久面向数据的资源。通过一组相关操作组合为一个要么全部成功要么全部失败的序列,可以简化错误恢复并使应用程序更加可靠。但并不是所有的操作序列都可以称为事务,成为事务必须满足:事务的原子性、一致性、隔离性、持久性。(总称ACID特性)

1、原子性:

原子是自然界最小的颗粒,具有不可再分的特性。事务中的所有操作可以看作一个原子,事务是应用中不可再分的最小的逻辑执行体,使用事务对数据进行修改的操作序列要么全部执行要么全不执行。通常某个事物中的操作都去具有共同的目标,并且是相互依赖的。如果数据库系统中,只执行这些操作中的一部分,可能会破坏事务的整体目标,而原子性消除了系统只处理部分操作的可能性。

2、一致性:

一致性是指事物执行的结果必须使数据库从一个一致性状态,改变到另一个一致性状态,当数据库中只包含事务成功提交的结果时,数据库处于一致性状态。一致性是通过原子性来保证的。

3、隔离性:

隔离性是指各个事务的执行互不干扰,任意一个事务的内部操作对其他并发的事务都是隔离的,也就是说并发执行的事务之间既不能看到对方的中间状态也不能相互影响。

4、持久性:

持久性指事务一旦提交,对数据所做的任何改变都要记录在永久存储器中,通常是保存进物理数据库,即使数据库出现故障提交的数据也应该能过恢复,但如果由于外部原因导致的数据库故障,如硬盘被损坏,那么之前提交的数据有可能丢失。

例题:使用事务保证转账安全:

-- 创建账户表
create table account(
	id int primary key auto_increment,
	uname varchar(10) not null,
	balance double
);

-- 向账户表中插入数据
insert into account values (null,'张三',2000),(null,'李四',2000);

-- 张三给李四转200元
update account set balance=balance-200 where id =1;
update account set balance=balance+200 where id =2;
-- 默认一个DML语句是一个事务,所以上面的操作执行了2个事务
-- 必须让上面的操作控制在一个事务中
-- 手动开启事务
start transaction;
update account set balance=balance-200 where id =1;
update account set balance=balance+200 where id =2;
-- 如果后悔了上述操作可以手动回滚:刚才执行的操作全部取消
rollback;
-- 手动提交
commit;
-- 在回滚和提交之前,数据库中的数据都是操作缓存中的数据,而不是数据库真实数据

-- 查看账户表
select * from account;

二、事务并发问题:

1、脏读(Dirty read):

当一个事务正在访问数据并且对数据进行了修改,而这种修改还没有提交到数据库中,这时另一个事务也访问了这个数据,然后使用了这个数据。因为这个数据是还没有提交的数据,那么另一个事务读到这个数据是“脏数据”,依据“脏数据”所做的操作可能是不正确的。

2、不可重复读:

指在一个事务内多次读同一数据。在这个事务还没有结束时,另一个事务也访问该数据。那么,在第一个事务中的两次读数据之间,由于第二个事务的修改导致第一个事务两次读取的数据可能不太一样。这就发生了在一个事务内两次读到的数据是不一样的情况,称为不可重复读。

3、幻读:

幻读与不可重复读类似。它发生在一个事务(T1)读取了几行数据,接着另一个并发事务(T2)插入了一些数据时,在随后的查询中,第一个事务就会发现多了一些原本不存在的记录,就好像发生幻觉一样,称为幻读。

不可重复读和幻读区别:

  • 不可重复读的重点是修改,幻读的重点在于新增或删除;
  • 解决不可重复读的问题只需要锁住满足条件的行,解决幻读需要锁住整个表。

三、事务的隔离级别:

 事务的隔离级别用于决定如何控制并发用户读写数据的操作。数据库是允许多用户并发访问的,如果多个用户同时开启事务并对同一数据进行读写 操作的话,有可能会出现脏读、不可重复读和幻读问题,所以MySQL中提供了四种隔离级别来解决上述问题。事务的隔离级别从低到高依次为:READ UNCOMMITTED、READ COMMITTED、REPEATABLE READ以及SERIALIZABLE,隔离级别越低,越能支持高并发的数据库操作。现实中SERIALIZABLE很少用,用的最多的是REPEATABLE READ(重复读)。

隔离级别脏读不可重复读幻读
READ UNCOMMITTED(读未提交的)
READ COMMITTED(读已提交的)×
REPEATABLE READ(重复度)××
SERIALIZABLE(序列化)×××

注:√代表会出现问题,×代表不会出现问题=解决问题

-- 查看默认的事务隔离级别 MySQL默认的是repeatable read
select @@transaction_isolation;

-- 设置事务的隔离级别(设置当前会话的隔离级别)
set session transaction isolation level read uncommitted;
set session transaction isolation level read committed;
set session transaction isolation level repeatable read;
set session transaction isolation level serializable;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一定能学会!!

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值