首页 > 其他分享 >事务

事务

时间:2023-09-23 15:46:52浏览次数:30  
标签:事务 -- user 签退 login id

事务

## 开始事务
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

相关文章

  • 事务和锁机制
    事务和锁机制事务和MySQL一样,在Redis中也有事务机制,当我们需要保证多条命令一次性完整执行而中途不受到其他命令干扰时,就可以使用事务机制。我们可以使用命令来直接开启事务:multi当我们输入完所有要执行的命令时,可以使用命令来立即执行事务:exec我们也可以中途取消事务:di......
  • 同一个类调方法导致注解式事务失效的问题
    说明在项目启动时,如果有@Transactional注解,spring是生成代理类来开启事务、提交事务和回滚事务的,但是如果是同一个类之间调用,就是直接调方法,导致事务失效。我们可以用一下方式在同一类获取当前类的代理对象,从而避免事务失效的问题。但是这种方式会有问题,下面有说明。推荐调用拆到......
  • 支付宝一面:多线程事务怎么回滚?说用 @Transactional 可以回去等通知了!
    背景介绍1,最近有一个大数据量插入的操作入库的业务场景,需要先做一些其他修改操作,然后在执行插入操作,由于插入数据可能会很多,用到多线程去拆分数据并行处理来提高响应时间,如果有一个线程执行失败,则全部回滚。2,在spring中可以使用@Transactional注解去控制事务,使出现异常时会进行......
  • MySQL索引、事务与存储引擎
    MySQL索引、事务与存储引擎索引介绍1、索引的概念索引是一个排序的列表,在这个列表中存储着索引的值和包含这个值的数据所在行的物理地址(类似于C语言的链表通过指针指向数据记录的内存地址)。使用索引后可以不用扫描全表来定位某行的数据,而是先通过索引表找到该行数据对应的......
  • Mysql中的事务
    1.事务的概念事务是一种机制、一个操作序列,包含了一组数据库操作命令,并且把所有的命令作为一个整体一起向系统提交或撤销操作请求,即这一组数据库命令要么都执行,要么都不执行。事务是一个不可分割的工作逻辑单元,在数据库系统上执行并发操作时,事务是最小的控制单元。事......
  • MySQL高级12-事务原理
    一、事务概念事务是一组操作的集合,他是一个不可分割的工作单位,事务会把所有操作作为一个整体一起向系统提交或者撤销请求操作,即这些操作要么同时成功,要么同时失败。二、事务特性原子性(Atomicity):事务是不可分割的最小操作单元,要么全部成功,要么全部失败一致性(Consistency):事......
  • 找接口的最优吞吐量 每秒事务处理数
    1.循环并发在聚合报告中找到波动不大的吞吐量本次找到的是每秒处理3177个事务1秒发送1个请求永远循环  聚合报告 2预估并发是6000个,所以需要将线程数改成2 ......
  • 事务回滚rollback-only异常
    方法上加事务注解@Transactional并且再在该方法中加入trycatch一旦出错则会报rollback-only异常;原因是事务回滚是一旦它在方法内发现了exception,就会向上回滚,此时你将异常包裹,先行处理掉异常后事务自然回滚不了。直接try去掉,然后解决异常即可。......
  • MySQL事务隔离级别详解
    MySQL事务隔离级别详解|JavaGuide(Java面试+学习指南)事务隔离级别总结SQL标准定义了四个隔离级别:READ-UNCOMMITTED(读取未提交):最低的隔离级别,允许读取尚未提交的数据变更,可能会导致脏读、幻读或不可重复读。READ-COMMITTED(读取已提交):允许读取并发事务已经提交的数......
  • Kingbase ES 游标跨事务及其案例一则
    前言本文介绍游标在PLSQL和SQL层跨事务使用案例,及其案例一则。本文验证版本:db0=#selectversion();db0-#/version----------------------------------------KingbaseESV008R006C007B0024onx86_64-pc-linux-gnu,compiledbygcc(GCC)4.8.520150623......