SQL(5)- 事务

1:事务简介

2:事务操作

3:事务四大特性

4:并发事务问题

5:事务隔离级别

一:事务简介

比如:转账,转账分为三个步骤(查询账户余额,xx账户余额-1000,xx账户余额+1000),而这三个步骤看成一个事务;

1:当执行完增删改之后,SQL事务默认自动提交;

sql 复制代码
use mydb2

create table account(
  id int auto_increment primary key comment '主键ID',
  name varchar(10) comment '姓名',
  money int comment '余额'
)comment '账户表'

show account
insert into account (id,name,money) values(null,'张三',2000),(null,'王五',2000)

--转账操作(张三给王五转1000)
--正常操作
--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 = '王五'

---异常操作(在2下面加层序抛异常)
---目前针对上面的SQL,相当于每一条SQL都是一个事务;所以要控制事务

二:事务操作

1:SQL默认自动提交事务;但是异常情况下,需要手动提交更保险

2:需要手动事务操作

1:select @@autocommit = 1 ; 表示事务自动提交

2:改为手动提交

set @@autocommit = 0

sql 复制代码
create table bank(
  id int auto_increment primary key comment '主键ID',
  name varchar(10) comment '姓名',
  money int comment '余额'
)comment '余额表'

show account
insert into bank (id,name,money) values(null,'张三',2000),(null,'王五',2000)


--查看事务是否是自动提交(1)
select @@autocommit 

--设置为手动事务提交
set @@autocommit = 0

--转账操作(张三给王五转1000)
--正常操作
--1:查询张三余额

select * from bank where name = '张三'

--2:将张三账户余额-1000
update bank set money = money - 1000 where name = '张三'


--3:将王五账户余额+1000
update bank set money = money +1000 where name = '王五'

--4:提交事务
commit 

--5:当执行出错时,需要回滚
rollback

方法二:

sql 复制代码
-- 方法二:
set @@autocommit = 1

--1:开启事务(手动提交事务)
start transaction 

--1:查询张三余额
select * from bank where name = '张三'

--2:将张三账户余额-1000
update bank set money = money - 1000 where name = '张三'

程序执行报错...

--3:将王五账户余额+1000
update bank set money = money +1000 where name = '王五'


--回滚(当前事务已经结束)
rollback 
相关推荐
倔强的石头_12 小时前
《Kingbase护城河》——猎捕慢查询:执行计划的微观解析与索引调优实战
数据库
SelectDB14 小时前
Apache Doris Python UDF:让 SQL 直接调用 Python 生态,支撑 Agent 时代复杂业务逻辑
大数据·数据库·python
Flittly16 小时前
【AgentScope Java新手村系列】(16)从RAG到多路检索
java·spring boot·spring
小兔崽子去哪了16 小时前
Java 生成二维码解决方案
java·后端
人活一口气20 小时前
从JVM调优到MCP协议:Java全栈技术体系深度总结与企业级架构实践
java·spring boot
NE_STOP1 天前
Vibe Coding -- 完整项目案例实操
java
荣码1 天前
GraphRAG:普通RAG只能回答"点"的问题,我踩了4个坑才搞懂
java·python
SimonKing1 天前
Google第三方授权登录
java·后端·程序员
明月光8181 天前
从一行 @Builder 说起:重新拾起 Java 的 Lombok、注解与 Builder 模式
java
考虑考虑1 天前
Mybatis实现批量插入
java·后端·mybatis