当前位置: 首页 > article >正文

mysql 学习11 事务,事务简介,事务操作,事务四大特性,并发事务问题,事务隔离级别

一 事务简介,

数据库准备:

create table account(
    id int auto_increment primary key  comment '主键ID',
    name varchar(128) not null comment '姓名',
    backaccountnumber char(18) unique  comment '银行账号',
    money float comment '余额'
)comment '银行账号表';

#drop table account;

insert into account
    values (null,'张三','123412341234123412',2000),
           (null,'lisi','123412341234123413',8000),
           (null,'wangwu','123412341234123414',9000);

二 事务操作,

由于mysql 默认的一条一条sql语句都是 默认开启事务的。

当我们执行三条sql语句的时候,1,2都成功了,但是3失败了,就会造成问题

这三条sql语句是:张三给李四的账号转1000块

        1.查询张三的账号的钱 大于1000块

        2. 张三money = money-1000;

        3, 李四money  = money +1000;

事务的操作的两种方式

select @@autocommit;
set @@autocommit = 0;

select * from account where name = '张三';
update account set money = money-1000 where name = '张三';
update account set money = money+1000 where name = 'lisi';

commit ;

rollback ;

start transaction ;

select * from account where name = '张三';
update account set money = money-1000 where name = '张三';
update account set money = money+1000 where name = 'lisi';


commit;

rollback ;

三 事务四大特性,

四 并发事务问题,

并发事务问题:指的是 A 事务  和 B事务 在同时 操作某一个章表的时候,发生的问题。

脏读

事务A 有三步:
    start transaction ;

    1. select money from account where id =1; # 查询 id 为1的银行账户
    2. update account set money = money+30000 where id = 1;  #工资发了3万
    3. update account set money = money+80000 where id = 1; # 奖金发了8万

    commit;

事务B 也有三步:
    start transaction ;

    1. select money from account where id =1; # 查询 id 为1的银行账户
    2. update account set money = money-10000 where id = 1;  #买了个华为手机
    3. update account set money = money-30 where id = 1; # 吃了个中午饭

    commit;

脏读发生的时机:事务B 读取到了 事务A 还没有commit的数据

当事务A 执行了第一步和第二步的时候,注意,这时候事务A 还没有提交

这时候事务B 执行了第一步,查询,会看到 账户已经加了3万块钱了

这个就是脏读

不可重复读

一个事务先后读取同一个数据,但是第一次 和 第二次 读取到的数据不同。

事务A 有4步:
    start transaction ;

    1. select money from account where id =1; # 查询 id 为1的银行账户,发现值是1000
    2. ......
    (这时候事务B 执行完3步后,提交了)
    3. select money from account where id =1; # 查询 id 为1的银行账户,发现值是2000
    4. .......
    commit;

事务B 有三步:
    start transaction ;

    1. select money from account where id =1; # 查询 id 为1的银行账户
    2. update account set money = 1000 where id = 1;  #钱变成了1000
    3. select money from account where id =1; # 查询 id 为1的银行账户

    commit;

幻读

五 事务隔离级别

那么前面遇到的 并发事务问题,应该怎么解决呢? 通过 设置 事务隔离级别 就可以解决。

# 查看当前 事务级别 是啥
select @@transaction_isolation;


# 设置 事务级别 session 代表会话级别的,只是对当前窗口有效; global 代表全局生效,即当前窗口和其他窗口都生效
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 ;

六 总结


http://www.kler.cn/a/541864.html

相关文章:

  • 跨平台开发利器:UniApp 全面解析与实践指南
  • 2025 年 2 月 TIOBE 指数
  • Maven 在 Eclipse 中的使用指南
  • (1/100)每日小游戏平台系列
  • TCN时间卷积神经网络多变量多步光伏功率预测(Matlab)
  • 数据仓库和商务智能:洞察数据,驱动决策
  • FANUC机器人示教器中如何显示或关闭寄存器或IO的注释信息?
  • AI时代下的安全新基石:零信任架构在人工智能系统中的应用
  • [python]png转webp的命令行工具
  • PyCharm结合DeepSeek-R1
  • JUnit5 单元测试详解
  • centos 7 关于引用stdatomic.h的问题
  • 【Git】完美解决git push报错403
  • 【20250211】栈与队列:225.用队列实现栈
  • 采集学校食堂人脸识别证件照,且尺寸底色统一的方法
  • 数据驱动企业数据智能化发展-通过财务数据分析模型评估企业经营健康度
  • ListWise 排序技术综述:从传统领域到大模型领域的跨越
  • APP广告变现,对接聚合广告平台创建广告位流程
  • dpdk的基础使用-抓包
  • RESTful开发中对象的合理使用探究
  • 分布式服务框架 如何设计一个更合理的协议
  • 爬取彩票网站数据
  • rpx和px混用方案
  • 【2024最新Java面试宝典】—— SpringBoot面试题(44道含答案)_java spingboot 面试题
  • el-table多列勾选
  • Vue2生命周期面试题