`

mysql 存储过程事务 同步异步性

阅读更多
昨天在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到数据库是一次性的,但是数据库本身的执行逻辑是并行的,最后加上了事务,才会有序执行。

事务这块不是特别熟悉,抛砖引玉。




分享到:
评论

相关推荐

    MySQL管理之道 性能调优、高可用与监控.part2.rar

    1.6.2 mysql5.5存储过程支持limit变量 54 1.7 mysql5.1升级为mysql5.5 55 1.7.1 采用mysql_upgrade升级授权表方式升级 55 1.7.2 直接安装mysql5.5,采用数据导出/导入方式升级 59 1.8 性能测试:mysql5.5与...

    简单谈谈MySQL的半同步复制

    半同步复制(Semi-synchronous Replication):相比异步复制,半同步复制牺牲了一定的性能,提升了主备之间数据的一致性(有一些情况还是会出现主备数据不一致)。 组复制(Group Replication):基于Paxos算法...

    cache Server V3

    Oracle、Sybase、DB2、mysql)的访问接口,可以以同步或异步方式和RDBMS 交互。 Rose内存数据库为需要容错服务的系统提供实时数据库复制功能和双机功能, 使系统可以实现高性能、高可用性、数据库一致性。Rose内存...

    网络内存数据库

    Cache Server提供了和传统关系数据库管理系统(MS SQL SERVER、Oracle、Sybase、DB2、mysql)的访问接口,可以以同步或异步方式和RDBMS交互。 Cache Server内存数据库为需要容错服务的系统提供实时数据库复制功能...

    Cache Server V1.2.0 嵌入式(实时)内存数据库(linux 32)

    Cache Server提供了和传统关系数据库管理系统(MS SQL SERVER、Oracle、Sybase、DB2、mysql)的访问接口,可以以同步或异步方式和RDBMS交互。 Cache Server内存数据库为需要容错服务的系统提供实时数据库复制功能...

    大数据常用数据库汇总.pdf

    随着数据请求并发量⼤不断增⼤,⼀般都是采⽤的集群同步数据的⽅式处理,就是将数据库分成了很多的⼩库,每个数据 库的数据内容是不变的,都是保存了源数据库的数据副本,通过同步或者异步⽅式保证数据的⼀致性,...

    律师事务所法律咨询源码-PHP

    律师事务所法律咨询源码安装十分方便,只需输入域名,然后再点两次鼠标,期间填入一些必要的安装信息就可以轻松完成整个安装过程。 使用十分便捷,安装后进后台,直接写咨询的内容就可以了,无需事先进行任何设置...

    【白雪红叶】JAVA学习技术栈梳理思维导图.xmind

    柔性事务(TCC) 一致性原理 CAP BASE 中间件 数据库 mysql 存储引擎 索引 锁 oracle db2 缓存 redis 数据结构 持久 复制 cas 单线程 memcache eacache Tair 消息队列 jms Queue Topic ...

    asp.net知识库

    SQL过程自动C#封装,支持从表到基本存储过程生成 使用SQLDMO控制 SQL Server 使用SQL-DMO实现定制SQL Scripts Create Tables and Build inserts from Tables by using Mygeneration Templates(Sql Server) C# 获取...

    基于微服务的车票管理系统源码+项目说明+sql数据库.tar

    + 基于MySQL存储业务数据,相关字段建立联合索引 + 基于Redis缓存Token、验证码、MQ分布式ID和每日热搜,基于Redisson解决一人一单 + :star:基于Seata解决订单和车次服务之间的分布式事务 ### 3. 流量与进程监控 + :...

    Java面试宝典2020修订版V1.0.1.doc

    8、同步和异步怎么理解?分别在什么情况下使用。 26 9、java后台如何接收ajax数据? 26 10、为什么要有jquery? 26 11、jQuery选择器有多少种? 27 13、你是如何使用jquery中的ajax的? 27 14、jquery中的$.get和$....

    高频大数据解决方案.pptx

    关键技术特性 ACID全事务支持 灵活的扩展性 错误恢复 可持久化到硬盘 内嵌OLAP 导出连接器 基于网络的异步集群复制 6 高频大数据解决方案全文共28页,当前为第6页。 关键特性: 线性扩展 7 增加一个新结点到VoltDB...

    Components.Repository:帮助POCO对象在.NET上同时使用SQL和NoSQL(MongoDB)数据库

    POCO对象可以与单个对象或同步对象同时存储在NoSQL数据库(MongoDB)和SQL数据库(SQLServer,MySQL,PostgreSQL)中属性/列的映射类似于ActiveRecord行为具有内置扩展属性与缓存组件( )集成,以减少所有I / O往返...

    开涛高可用高并发-亿级流量核心技术

    7.1 事务回滚 139 7.2 代码库回滚 140 7.3 部署版本回滚 141 7.4 数据版本回滚 142 7.5 静态资源版本回滚 143 8 压测与预案 145 8.1 系统压测 145 8.1.1 线下压测 146 8.1.2 线上压测 146 8.2 系统优化和容灾 147 ...

    涵盖了90%以上的面试题

    同步接口和异步接口的区别 为什么要加入锁机制 如何确定是否应该上锁?即如何判断是否有线程安全问题 什么是markword 乐观锁和悲观锁 偏向锁 轻量级锁 自旋锁 自适应自旋锁 重量级锁 synchronized 可重入锁 土方法...

    JAVA上百实例源码以及开源项目源代码

    2个目标文件,FTP的目标是:(1)提高文件的共享性(计算机程序和/或数据),(2)鼓励间接地(通过程序)使用远程计算机,(3)保护用户因主机之间的文件存储系统导致的变化,(4)为了可靠和高效地传输,虽然用户...

    JAVA上百实例源码以及开源项目

    2个目标文件,FTP的目标是:(1)提高文件的共享性(计算机程序和/或数据),(2)鼓励间接地(通过程序)使用远程计算机,(3)保护用户因主机之间的文件存储系统导致的变化,(4)为了可靠和高效地传输,虽然用户...

Global site tag (gtag.js) - Google Analytics