MYSQL 原子得到UPDATE变化的值

探讨在应用中使用多条SQL语句实现自增操作的非原子性,并提出简单有效的原子性优化方法,确保数据唯一性和一致性。

在一个应用中,有一条mysql function 中使用了多条SQL文实现 自增 如

update sequence set current_value=current_value+increment where name=item_name;

select current_value from sequence where name=item_name.

不去分析为什么不使用自增而使用这样的设计,单从这样的实现本身不是原子,如要保证唯一性还需要加锁。


简单的做法是:

         UPDATE sequence  SET current_value = @value:=current_value+increment  WHERE name = item_name;

         RETURN @value; 
### MySQL 中的原子操作及其实现 #### 原子性的定义 在数据库领域,事务被定义为逻辑工作单元,其中包含一个或多个 SQL 语句,并且这些语句必须满足 **ACID** 特性之一——**Atomicity(原子性)**。这意味着整个事务要么完全成功提交,要么完全回滚,不会存在部分执行的情况[^1]。 #### MySQL原子性实现方式 MySQL 使用多种技术手段来保障事务的原子性: 1. **InnoDB 存储引擎的支持** InnoDB 是 MySQL 默认支持 ACID 属性的存储引擎。它通过日志文件(Redo Log 和 Undo Log)以及事务管理器实现了事务的持久性和原子性。 - Redo Log:用于记录事务对数据页所做的修改,在崩溃恢复时能够重做已完成的工作。 - Undo Log:保存旧版本的数据副本,当事务失败或者需要回滚时,可以通过 Undo Log 还原到原始状态[^3]。 2. **两阶段提交协议(Two-Phase Commit Protocol)** 在分布式环境中,为了确保跨节点的一致性,MySQL 实现了两阶段提交协议: - 准备阶段(Prepare Phase):通知所有参与方准备提交事务; - 提交阶段(Commit Phase):如果所有参与者都准备好,则正式提交;否则触发回滚机制[^4]。 3. **锁机制与隔离级别** 锁定策略对于维护事务间的独立运行至关重要。不同隔离级别下的锁定行为如下所示: - Read Uncommitted:不加任何行级锁,可能导致脏读现象; - Read Committed:仅持有短时间内的共享锁,避免重复读问题; - Repeatable Read:在整个事务期间保持一致视图,防止不可重复读发生; - Serializable:最高级别的隔离度,强制串行处理请求以杜绝幻影读等问题[^4]。 以下是展示如何利用 `START TRANSACTION` 开启新会话并验证其特性的小例子: ```sql -- 创建测试表 CREATE TABLE test_atomic ( id INT PRIMARY KEY, value VARCHAR(50) ); -- 插入初始数据 INSERT INTO test_atomic VALUES (1, 'Original Value'); -- 测试事务一 START TRANSACTION; UPDATE test_atomic SET value='Updated by TXN1' WHERE id=1; SELECT * FROM test_atomic; -- 查看当前更改结果 ROLLBACK; -- 或者 COMMIT 来决定最终命运 -- 并发场景下另一个连接尝试访问相同资源... ``` #### 隔离级别配置方法 用户可以根据实际业务需求调整全局或特定 session 下的有效隔离层次: ```sql SET GLOBAL TRANSACTION ISOLATION LEVEL READ COMMITTED; SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ; ``` 以上命令分别设置了服务器启动后的默认以及临时生效于单次对话中的设定[^2]。 --- ###
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值