25-基础SQL-事务

发布时间 2023-12-08 17:23:02作者: 马铃薯1

事务简介

 

案例:创建 账户表(熟悉事务操作)

CREATE TABLE account(
    id int auto_increment primary key comment "主键ID",
    name varchar(10) comment "姓名",
    money int comment "余额"
) comment "账户表";

INSERT INTO account(id, name, money)
VALUES
(null, "张三", 2000),
(null, "李四", 2000);

1)转账操作(张三给李四转账1000)

a. 查询张三账户余额

SELECT money FROM account WHERE name = "张三";

b. 将张三账户余额 -1000

UPDATE account SET money = money - 1000 WHERE name = "张三";

c. 将李四账户余额 +1000

UPDATE account SET money = money + 1000 WHERE name = "李四";

这里需要注意,如果上述三项操作中出现异常的情况,就会导致数据不一致,因此需要将所有操作作为一个整体,一起提交或撤销操作

 

事务操作

第一种方式,通过关闭事务的自动提交,使用事务的手动提交操作实现(张三给李四转账1000)

-- 查看事务
SELECT @@autocommit;

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

-- 1. 查询张三账户余额
SELECT money 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;

第二种方式,不修改事务的提交方式,通过开启事务的操作实现(张三给李四转账1000)

-- 设置 将事务改回自动提交
SET @@autocommit = 1;

-- 开启事务
START TRANSACTION;

-- 1. 查询张三账户余额
SELECT money 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;

 

事务的四大特性

  事务隔离级别,就是为了解决以上并发事务可能存在的问题