事务

发布时间 2023-09-23 15:43:15作者: liuzonglin

事务

## 开始事务
begin;

## 提交事务
commit;

## 回滚
rollback;  

以下是一个简单的示例,包括表结构和一些示例数据。
首先创建一个用户表:

CREATE TABLE user (  
   user_id INT PRIMARY KEY,  
   username VARCHAR(50) NOT NULL,  
   password VARCHAR(50) NOT NULL,  
   email VARCHAR(100) NOT NULL  
);  

然后插入一些用户数据:

INSERT INTO user (user_id, username, password, email) VALUES  
(1, 'Alice', 'password1', 'alice@example.com'),  
(2, 'Bob', 'password2', 'bob@example.com'),  
(3, 'Charlie', 'password3', 'charlie@example.com');  

接下来创建一个登录表:

CREATE TABLE login (  
   user_id INT,  
   login_time TIMESTAMP,  
   PRIMARY KEY (user_id, login_time),  
   FOREIGN KEY (user_id) REFERENCES user (user_id)  
);  

现在我们开始一个事务,首先签到,然后签退。如果签退时间比签到时间早,回滚事务。

begin;  -- 开始事务
-- 插入签到记录  
INSERT INTO login (user_id, login_time) VALUES (1, NOW());
-- 模拟签退时间  
SET @签退时间 = NOW() - INTERVAL 1 HOUR;
-- 插入签退记录  
INSERT INTO login (user_id, login_time) VALUES (1, @签退时间);
-- 检查签退时间是否合理  
IF @签退时间 < NOW() THEN  
   rollback;  -- 回滚事务  
   SELECT '签退时间不能早于签到时间';  
ELSE  
   commit;  -- 提交事务  
   SELECT '签到和签退成功';  
END IF;  

这个示例展示了如何使用事务来保证数据的一致性。在这个例子中,如果签退时间早于签到时间,事务将被回滚,否则事务将被提交。

案例 1:银行转账
假设有两个账户 A 和 B,现在需要从 A 账户向 B 账户转账 100 元。可以使用事务来保证转账操作的原子性。

begin;  -- 开始事务
-- 从 A 账户扣除 100 元  
update account set balance = balance - 100 where account_id = A;
-- 向 B 账户添加 100 元  
update account set balance = balance + 100 where account_id = B;
commit;  -- 提交事务  

案例 2:购物
假设一个购物系统,用户购物时需要更新库存和用户余额。

begin;  -- 开始事务
-- 更新库存  
update product set stock = stock - 1 where product_id = purchased_product_id;
-- 更新用户余额  
update user set balance = balance - price where user_id = purchased_user_id;
commit;  -- 提交事务  

案例 3:用户注册
假设一个用户注册系统,需要创建用户记录和登录记录。

begin;  -- 开始事务
-- 插入用户记录  
insert into user (username, password, email) values (username, password, email);
-- 插入登录记录  
insert into login (user_id, login_time) values (user_id, NOW());
commit;  -- 提交事务  

案例 4:员工考勤
假设一个员工考勤系统,需要记录员工每天的签到和签退时间。

begin;  -- 开始事务
-- 插入签到记录  
insert into attendance (employee_id, sign_in_time) values (employee_id, NOW());
-- 插入签退记录  
insert into attendance (employee_id, sign_out_time) values (employee_id, NOW());
commit;  -- 提交事务