首页 新闻 搜索 专区 学院

事务并发难题

0
悬赏园豆:200 [待解决问题]

收付费系统,不要问我表为什么设计成这样,传统IT行业有很多难处,所以表结构不能变,且不能用pl/sql。

 

表结构: 业务号、客户、金额、收付标识

原子操作粒度:需要 group by 业务号, 客户  , 并判断sum(收的金额) - sum(付的金额)如果正的为收费,负的为付费进行收付费。

其他说明:精简了表结构,还有其他复杂查询条件

 

现在问题来了,表的量级上亿。 有批处理一次处理100~200万条的数据,以group by之后5000条数据为一次事务。

批处理过程中,还有其他方式对这些数据进行收付。

 

求方案使得:

1. 批处理和其他方式不会有冲突(事务错乱),同时不会造成其他方式长时间卡顿。

2. 一次批处理时间在可接受范围内, 30分钟内能完成吧。

贰零妖舞的主页 贰零妖舞 | 初学一级 | 园豆:4
提问于:2015-04-28 11:43
< >
分享
所有回答(7)
0

不用pl/sql,你是想用什么?

幻天芒 | 园豆:36594 (高人七级) | 2015-04-28 14:58
0

你表结构不能改, 又不能用plsql, 这个……

怎么就不能改呢, 加个字段会影响?

问天何必 | 园豆:3301 (老鸟四级) | 2015-04-28 15:10

能改表结构,早就改了。

 

SB评审不通过, 相同的汇总表用了2个,无力吐槽

支持(0) 反对(0) 贰零妖舞 | 园豆:4 (初学一级) | 2015-04-28 15:51
0

200园豆太少了,真的把这问题解决了,怎么也得2WRMB。

Firen | 园豆:5483 (大侠五级) | 2015-04-28 15:34
0

任何软件问题都可以通过加一层解决。你可以改变策略,把需要批处理的数据结转到一个表,然后处理完之后再把结果同步到之前的那个表结构不能改的主表上,多年前我搞过很多类似这种脏活累活...好的,园豆是我的了,谢谢。

JeffWong | 园豆:2021 (老鸟四级) | 2015-04-28 15:53
0

一般是用冗余来解决你这些问题 

及将历史数据和及时数据分离

先算出历史数据然后在加上你的及时数据 然后就是完整的数据

 

如果做的更好点 就是分维度了 按照数据的维度不同 冗余多张表 然后通过直接查询代替计算 来减少消耗

小眼睛老鼠 | 园豆:2774 (老鸟四级) | 2015-04-28 16:57
0

这个简单

 

SqlConnection con = new SqlConnection("连接串");
            using (SqlTransaction tran = con.BeginTransaction())
            {
                try
                {
                    //  group by 业务号, 客户 
                    //取出5000条数据

                    for (int i = 0; i < 5000; i++)
                    {
                         //一个一个 判断sum(收的金额) - sum(付的金额)如果正的为收费,负的为付费进行收付费
                         // 组装 update语句

                        //设置 收付款标识

                        // 将操作过的数据 设置一个标声

                        //下次操作的时候 标志 继续操作

                        
                    }

                    
                    tran.Commit();
                }
                catch (Exception)
                {
                    tran.Rollback();
                }
            }
田麦成 | 园豆:1984 (小虾三级) | 2015-04-28 17:04
0

感谢各位的回答,因为不能冗余,不能加表。所以诸位的方案都无法采用。

 

最后我把所有的控制都放到内存, 针对ID进行哈希,并对哈希表做同步处理。

 

一次事务占用内存1M左右,可以接受

贰零妖舞 | 园豆:4 (初学一级) | 2015-04-28 17:44

你说的不就是我的方案么

支持(0) 反对(0) 田麦成 | 园豆:1984 (小虾三级) | 2015-04-28 17:48

200是我的,哈哈哈哈

支持(0) 反对(0) 田麦成 | 园豆:1984 (小虾三级) | 2015-04-28 17:48

你采用了我的方案,你个骗子

支持(0) 反对(0) 田麦成 | 园豆:1984 (小虾三级) | 2015-04-28 18:00

@田麦成: 哥们,恕我直说, 你这是把大对象放到内存么。  我的方案和你这个一点都不沾边啊

支持(0) 反对(0) 贰零妖舞 | 园豆:4 (初学一级) | 2015-04-28 20:58

@田麦成:  我说的控制是其他方式和批处理之间的同步问题。  

支持(0) 反对(0) 贰零妖舞 | 园豆:4 (初学一级) | 2015-04-28 21:06
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册