数据库MySQL —— 事务

本文介绍了数据库事务的基本概念,包括事务的四大特性(原子性、一致性、隔离性、持久性),并讨论了并发事务可能导致的脏读、不可重复读和幻读问题。此外,还阐述了MySQL中的事务操作以及如何通过设置事务隔离级别来解决并发问题。
摘要由CSDN通过智能技术生成

目录

一、事务简介

 二、事务操作

三、事务四大特性(ACID)

四、并发事务问题

1.  脏读

 2.  不可重复读

 3.  幻读

 五、事务隔离级别


一、事务简介

事务 是一组操作的集合,它是一个不可分割的工作单位,事务会把所有的操作作为一个整体一起向系统提交或撤销操作请求,即这些操作 要么同时成功,要么同时失败

举例说明:最典型例子:银行转账(张三向李四转一千块钱)

  1. 正常情况:
    查询张三账户余额
    张三账户余额 -1000
    李四账户余额 +1000
  2. 异常情况: (此时张三减少的钱不能加给李四)

    因此,我们想要解决这种异常,我们就需要通过 数据库的事务 来解决,将上述三个操作定义在一个事务当中,要么全部执行成功,要么全部执行失败。

  3. 解决情况:(事务)

回滚事务就是指将之前临时修改的数据恢复回去,即初始化。

 对于MySQL数据库来说,事务是默认自动提交的,也就是说当我们进行增删改的某一条语句时,语句结束完,事务就提交给数据库,数据库中数据就会立刻变更过来。

 二、事务操作

  • 查看 / 设置 事务提交方式:

          SELECT @@autocommit ;(自动提交)

          SET @@autoconnit = 0;(手动提交)

  • 提交事务:START TRANSACTIONBEGIN;
  • 提交事务:COMMIT;
  • 回滚事务:ROLLBACK;

上述例子操作:

-- 创建表添加数据
create table account(
    id int auto_increment primary key comment '主键',
    name varchar(10) comment '姓名',
    money int comment '金额'
)comment '账户表';
insert into account (id, name, money) values (null,'张三',2000),(null,'李四',2000);

update account set money = 2000 where name = '张三' or  name = '李四';

-- 方式一:
select @@autocommit;

set @@autocommit = 0;

-- 转账操作
-- 1.查询张三账户余额
select * from account where name = '张三';
-- 2.张三账户余额 -1000
update account set money = money - 1000 where  name = '张三';
程序抛出异常...
-- 3.李四账户余额 +1000
update account set money = money + 1000 where  name = '李四';

-- 提交事务
commit ;
-- 回滚事务
rollback ;



-- 方式二:
-- 转账操作

-- 开启事务
start transaction ;

-- 1.查询张三账户余额
select * from account where name = '张三';
-- 2.张三账户余额 -1000
update account set money = money - 1000 where  name = '张三';
程序抛出异常...
-- 3.李四账户余额 +1000
update account set money = money + 1000 where  name = '李四';

-- 提交事务
commit ;
-- 回滚事务
rollback ;

三、事务四大特性(ACID)

  • 原子性Atomicity):事务是不可分割的最小操作单元,要么全部成功,要么全部失败。
  • 一致性Consistency):事务完成时,必须使所有的数据都保持一致状态。
  • 隔离性lsolation):数据库系统提供的隔离机制,保证事务在不受外部并发操作影响的独立环境下运行。
  • 持久性(Durability):事务一旦提交或回滚,它对数据库中的数据的改变就是永久的。
     

四、并发事务问题

并发事务问题指 事务A 和 事务B 在同时操作某一个数据库甚至是某一张表时,所引发的一些问题。

问题描述
脏读一个事务读到另外一个事务还没有提交的数据。
不可重复读一个事务先后读取同一条记录,但两次读取的数据不同,称之为不可重复读。
幻读一个事务按照条件查询数据时,没有对应的数据行,但是在插入数据时,又发现这行数据已经存在,好像出现了"幻影”。

1.  脏读

事务A第一步操作执行完后执行第二步操作,但是事务没有执行完毕是没有提交的,事务A第二步操作结束完后会对数据库表中数据进行更新,此时另外一步事务B进行查询操作,而事务B查询到的正好是事务A第二步操作更新的数据,但是事务A并没有提交。

 2.  不可重复读

事务A执行第一步操作后,开始执行第二步操作同时事务B执行更新操作,操作结束后将数据提交到数据库,接着事务A执行第三步操作,此时第一步操作和第三部操作都为一样的查询语句,但是结果不同。

 3.  幻读

事务A执行第一步操作,此时事务B也执行操作,执行完毕将数据提交给数据库,接着事务A执行第二步操作,但是发现执行失败,对应主键已经存在,但是当执行第三步操作时,执行结果为空。

 五、事务隔离级别

根据上述我们对并发事务问题的了解,接下来我们就学习事务隔离级别来解决这些问题:

隔离级别脏读不可重复读幻读
Read uncommitted
Read committed
Repeatable Read(默认)
Serializable
  • 查看事务隔离级别:SELECT @@TRANSACTION_ISOLATION;
  • 设置事务隔离级别:SET [ SESSION | GLOBAL ] TRANSACTION ISOLATON LEVEL { READUNCOMMITTED | READ COMMITED│REFPEATABLE READ│ SERALZABLE }

注意:事务隔离级别越高,数据越安全,但是性能越低

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Hgngy.

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

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

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

打赏作者

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

抵扣说明:

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

余额充值