昨天在fix一个issue的时候发现了这样一个事情:
程序完整的调用了三次mysql的存储过程:
BEGIN
DECLARE _adindex INT;
DECLARE _count INT;
DECLARE _filename VARCHAR(50);
DECLARE _result VARCHAR(70) DEFAULT '';
SELECT MAX(adindex) INTO _adindex FROM `advert`;
SET _adindex=IFNULL(_adindex, 0)+1;
SET _filename=CONCAT( 'advert', '_', CAST(_dbname AS CHAR), '_', CAST(_adindex AS CHAR), '.jpg');
select count(*) into _count from advert where`imgurl` = CONCAT(_imgurl, '/', _filename);
IF (_count<=0) THEN
INSERT INTO advert( adindex, imgurl) values (_adindex, CONCAT(_imgurl, '/', _filename));
SET _result = _filename;
END IF;
select _result as result;
END
-----
然后发现MAX adindex 三次的数据都是一样的。
虽然我在java代码中同步了单次调用的代码块,但是由于存储过程从jvm中滚出去是一次性的,最后在mysql的执行过程中,三次并发的查询导致了一样。
-----
所以需要如下修改:
BEGIN
DECLARE _adindex INT;
DECLARE _count INT;
DECLARE _filename VARCHAR(50);
DECLARE _result VARCHAR(70) DEFAULT '';
START TRANSACTION;
SELECT MAX(adindex) INTO _adindex FROM `advert`;
SET _adindex=IFNULL(_adindex, 0)+1;
SET _filename=CONCAT( 'advert', '_', CAST(_dbname AS CHAR), '_', CAST(_adindex AS CHAR), '.jpg');
select count(*) into _count from advert where`imgurl` = CONCAT(_imgurl, '/', _filename);
IF (_count<=0) THEN
INSERT INTO advert( adindex, imgurl) values (_adindex, CONCAT(_imgurl, '/', _filename));
SET _result = _filename;
END IF;
select _result as result;
COMMIT;
END
ok可以看到红字事务,加上之后adindex正常得到了三个,事务同步了本次操作。
存储过程的事务性,保证了同步性,猜想:在不加上事务的情况下,虽然JVM到数据库是一次性的,但是数据库本身的执行逻辑是并行的,最后加上了事务,才会有序执行。
事务这块不是特别熟悉,抛砖引玉。
分享到:
相关推荐
同步复制(Synchronous Replication)要求在事务提交到主服务器的存储引擎并且返回给客户端commit成功的状态之前,必须确保该事务已经被所有从服务器接收并应用。在MySQL中,这通常是通过在事务提交后等待所有从...
在实现数据同步时,MySQL使用事务来保证数据的一致性。事务是一组数据库操作,这些操作要么全部成功,要么全部回滚,确保了数据的完整性和一致性。例如,如果在一个事务中进行了修改操作,这些更改只有在事务提交后...
在IT行业中,数据库同步是一个重要的任务,特别是在分布式系统或者混合数据库环境里...同时,注意数据安全和一致性,确保在同步过程中不丢失或损坏数据。对于大型系统,可能还需要考虑同步的延迟、错误处理和回滚机制。
MySQL主从复制是一种重要的数据库高...异步复制注重性能,半同步复制兼顾数据安全性,而GTID复制则提供了更加灵活和可靠的复制管理方式。正确理解和运用这些复制策略,能够有效地提高数据库系统的可用性和数据完整性。
MySQL数据库是世界上最受欢迎的开源关系型数据库之一,其在数据管理、事务处理和高可用性方面表现出色。本文将深入探讨“MySQL双向数据同步”这一关键知识点,这在分布式系统、多数据中心部署以及高并发环境下确保...
MySQL-Transfer作为一项专门针对MySQL异步复制延迟问题的技术解决方案,通过细化并行处理单元、优化复制过程等方式显著提高了复制效率,降低了复制延迟。同时,它还提供了多种运维架构的支持,满足不同场景下的需求...
11. **复制与集群**:介绍MySQL的复制技术,包括异步复制、半同步复制,以及如何设置和管理复制拓扑。同时,也涉及到了MySQL集群的概念和配置。 12. **InnoDB Cluster**:MySQL 8.0引入的高可用性和可扩展性解决...
6. Replication(复制):MySQL的主从复制功能允许数据在多个服务器之间同步,源码中可以研究如何实现异步复制、半同步复制等模式。 7. 存储格式:MySQL的数据存储格式,如MyISAM和InnoDB的物理结构,包括数据文件...
复制模式有异步、半同步和全同步,了解其工作原理和故障恢复策略至关重要。 9. **备份与恢复**:定期备份是数据安全的重要保障。MySQL提供多种备份工具,如mysqldump、xtrabackup等,理解备份策略和恢复流程是...
这份“mysql8.0官方文档离线版”包含了关于MySQL 8.0的所有详细信息,包括安装、配置、优化、备份、恢复、安全性、SQL语法、存储引擎、触发器、视图、索引、事务处理等各个方面的内容。以下是对这些知识点的详细阐述...
此外,这一系列版本可能逐步增加了事务处理、存储过程的支持,以及错误处理和连接池等功能。随着版本的迭代,稳定性、性能和兼容性得到了提升。 接下来,进入5.0.3.0到5.2.7.0的阶段。在这个时期,MySQL.Data着重于...
- 支持视图、触发器、存储过程,提高数据库操作的灵活性和效率。 - 强大的复制功能,允许数据在多个服务器间同步,实现负载均衡和故障恢复。 2. **在Windows 32位环境下的安装**: - MySQL 5.0.22的win32版本...
基于行的复制比基于语句的复制有更高的精确性和可预测性,因为它不依赖于SQL语句的执行顺序,同时还可以避免一些基于语句复制可能遇到的问题,比如不可重复的函数调用(例如now()函数)和某些类型的操作语句(如...
MySQL主从服务器数据库同步是一种常见的高可用性和负载均衡策略,特别是在大型系统中,用于确保数据的一致性并分散读写操作。以下是对MySQL主从同步技术的详细解释: 1. **主从同步原理**: - MySQL的同步机制基于...
MySQL复制是MySQL提供的一种数据同步技术,它支持单向、异步的数据复制。在复制过程中,主服务器会将更新写入到二进制日志文件中,并将这些更新复制到一个或多个从服务器上。MySQL复制可以实现数据的备份、读写分离...
4. **复制与高可用**:理解主从复制的工作原理,包括异步复制、半同步复制和多源复制。学习如何配置和管理复制,以及在故障恢复时的角色切换。 5. **安全**:了解MySQL的安全模型,包括用户权限管理、加密存储、...
在C++中调用MySQL的存储过程,通常通过`mysql_callproc()`函数,传入存储过程名和参数。返回值和结果集可以通过`mysql_store_result()`和`mysql_use_result()`处理。这种封装对于提高性能、减少网络传输以及实现复杂...
MySQL支持存储过程和触发器,允许用户编写复杂的数据库逻辑,提高代码复用性和安全性。 十、分区与分表 MySQL支持表的分区,将大表分成多个物理部分,提高查询性能。当数据量巨大时,可以考虑水平分表(Sharding)...