Mysql的事务

本文详细介绍了MySQL中的事务概念,强调其原子性、一致性、隔离性和持久性四大原则。通过转账案例解释了事务如何保证数据安全,并讨论了事务操作中的回滚点设置以及不同隔离级别下的问题,如脏读、不可重复读和幻读,最后提到了串行化隔离级别的使用场景。
摘要由CSDN通过智能技术生成

MySQL中的事务是一组数据库操作,这些操作被视为单个逻辑单元并且被当做原子操作执行,这意味着它们要么全部成功,要么全部失败,没有中间状态。事务通常用于确保数据库中的数据完整性和一致性。

在MySQL中,事务可以使用以下命令启动和结束:

BEGIN或START TRANSACTION:用于开始一个新的事务。
COMMIT:用于提交事务,即将所做的更改保存到数据库中。
ROLLBACK:用于撤销事务,即回滚到事务开始之前的状态。
复制代码

MySQL数据库本身是自带事务,MySQL在执行SQL语句的时候是【自动提交事务】,保证SQL语句正常执行并且更改数据库中数据,MySQL中事务主要就是保证数据库中数据安全性,通过事务的特征(ACID)已到达SQL语句操作数据的安全性

MySQL的事务其实就是一组逻辑性操作,这个操作的要求要么都成功,要么都失败

因为MySQL是自动事务,所以对于某些操作需要手动开启事务才可以达到效果

数据的准备

# 准备一些事务数据
# 创建一张账户表
create table account(
    id int PRIMARY KEY AUTO_INCREMENT,
    name varchar(20) NOT NULL,
    money double
);

# 插入数据
INSERT INTO account(name,money) values
('zs',10000),('ls',10000);

select * from account;
复制代码

MySQL中事务就是保证数据库内表中数据被SQL语句修改之后数据安全问题,使用就是事务提供特性(ACID),模拟一个场景:利用account账户进行转账和收款的过程

提供一组操作 zs 转账1000【money - 1000】 ls 进账 1000 【money+1000】

MySQL使用事务原则特性就是保证 SQL语句的执行要么都成功,要么都失败

提供一组操作成功 zs 余额 9000 ls 余额 11000

提供一组操作失败 zs 余额 10000 ls 余额 10000

提供一组操作是不会出现 zs 余额 9000 ls余额10000 或 zs 余额10000 ls余额 11000

正常转账版本

# 假设 zs 和 ls 谈成了一笔大面买 交易金额是1000元
# 需要从 zs 账户中将1000元扣除  ls 账户中需要加入这1000
# zs 需要转账 1000 
UPDATE account SET money = money-1000 WHERE name = 'zs'; -- 模拟转账

# ls 需要进账 1000
UPDATE account SET money = money+1000 WHERE name = 'ls'; -- 模拟收款

# 账户查询
SELECT * FROM account;
复制代码

2021-12-17_0848592021-12-17_084859

提供一个异常转账的操作

# 准备一些事务数据
# 创建一张账户表
create table account(
    id int PRIMARY KEY AUTO_INCREMENT,
    name varchar(20) NOT NULL,
    money double
);

# 插入数据
INSERT INTO account(name,money) values
('zs',10000),('ls',10000);

select * from account;

# 假设 zs 和 ls 谈成了一笔大面买 交易金额是1000元
# 需要从 zs 账户中将1000元扣除  ls 账户中需要加入这1000
# zs 需要转账 1000 
UPDATE account SET money = money-1000 WHERE name = 'zs'; -- 模拟转账

/*
模拟 【数据库因为zs用户转账之后数据出现问题】
zs 转账之后出现问题 ---》 突然间出现【断电、火灾、数据库崩溃、各种操作异常】

导致 ls的收款语句【没有执行】,程序直接退出  ls账户没有任何金额进入

MySQL是自动事务,提交到MySQL中数据库操作一旦执行成功就“永久生效”
此时面临这样场景,MySQL中自动事务就无法满足需求

事务最主要特点就是:【要么都成功,要么都失败】
而现在就违背了这个原则: zs 转账之后扣款1000 但是出现问题,这1000元不应该扣款成功,而是返回给zs账户。

像这样对于数据库中数据修改的操作 建议将自动事务修改为手动事务
*/

# ls 需要进账 1000
UPDATE account SET money = money+1000 WHERE name = 'ls'; -- 
模拟收款

# 账户查询
SELECT * FROM account;
复制代码

2021-12-17_0904082021-12-17_090408

可以对MySQL进行手动事务的开启


    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值