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_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_090408
可以对MySQL进行手动事务的开启