事务
## 开始事务
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', '[email protected]'),
(2, 'Bob', 'password2', '[email protected]'),
(3, 'Charlie', 'password3', '[email protected]');
接下来创建一个登录表:
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; -- 提交事务
标签:事务,--,user,签退,login,id
From: https://www.cnblogs.com/liuzonglin/p/17724461.html