多个事务和一个事务的不同点

13-09-11 leizhaojin
         

我们项目用存储过程比较多,但是里面的语句有的执行时间比较长,所以我打算把他们从存储过程提出来,用JDBC直接执行这几个SQL,同时应用多线程来缩短执行时间,每个线程里开启一个事务。我通过使用CyclicBarrier可以做到这几个线程里的事务像分布式事务一样,实现了All-or-Nothing原则。但是由于线程的启动的时间不可预测,所以线程里的事务开启时间也不同,数据库的状态可能在这个时间差里发生变化。所以想请各位大牛给予指点:多个事务开启,开启时间不同,但是这几个事务能同时提交或回滚,那么这几个事务和在一个存储过程有什么大的不同?风险在哪里?

我的另一篇博客有我关于这个方案的的例子解释:多线程和事务之Workaround

[该贴被leizhaojin于2013-09-11 21:20修改过]

         

1
banq
2013-09-12 06:48

2013-09-11 21:18 "@leizhaojin

"的内容

风险在哪里? ...

正如你自己帖子中提到:所以在最先启动的线程和最后启动的线程这个时间段里,数据库的状态可能发生了变化,比如某些数据被删除了,就会造成最终结果的不精确。

其实无论是使用数据库锁 还是多线程,这里有一个共同思路,就是将数据喂给线程,就如同计算机是一套加工流水线,数据作为原材料投入这个流水线的开始,流水线出来后就是成品,这套模式的前提是数据是被动的,自身不复杂,没有自身业务逻辑要求。适合大数据处理或互联网网站应用等等。

但是如果数据自身要求有严格的一致性,也就是事务机制,数据就不能被动被加工,要让数据自己有行为能力保护实现自己的一致性,就像孩子小的时候可以任由爸妈怎么照顾关心都可以,但是如果孩子长大有自己的思想和要求,他就可能不喜欢被爸妈照顾,他要求自己通过行动实现自己的要求。

数据也是如此。

只有我们改变思路,让数据自己有行为维护自己的一致性,才能真正安全实现真正的事务。

我专门写一篇文章见:http://www.jdon.com/45728

[该贴被banq于2013-09-12 08:02修改过]

leizhaojin
2013-09-13 11:43

banq:

谢谢你的回答,但是总感觉有点隔靴搔痒的味道。

可能是我没有表达清楚,其实我的要求就是页面需要数据(也有更新),开始是在一个存储过程里做的,只是响应时间问题,所以我打算用多线程,但是又希望能保证他们在提交或回滚还是保持原子性。

我的尝试正如我的另一个CSDN的帖子那样,今天看了Software Transaction Memory后,感觉这个正是我努力的方向。但是这篇文章没有给出具体Java的解决方案,似乎是Scala的东西。

当然你的回答是极力推崇Actor模式,这个和STM有共同之处。

如果你不介意,希望你能就我的个例深入点给出建议,谢谢。

BrightSpring
2013-09-13 12:14

你不是要保证原子性吧,是要保证事务的隔离性吧,百度这方面比较好

leizhaojin
2013-09-13 14:49

首先要抱怨下,我在发表回复的窗口打字,时间超过了浏览器刷新的时间框,结果浏览器自动刷新时,我的评论丢失了,哎。。。。

@BrightSpring

你的回答不错,我没有考虑到 Isolation, 但是我觉得我的方案在某些应用情况下是可以工作的。打一个不太恰当的比喻:父亲回家了,三个小孩都会得到糖果,如果哪一个没得到,其他的小孩都不会得到,以示公平。可以用三个线程让每个小孩得到糖果。这里,得到糖果如果是一条insert语句的话,那么我们只需要ACD得到保证,Isolation可有可无,如果insert语句不违反数据库的约束。

之前我的回复中提到STM,STM旨在提供一个替代Java Lock且避免死锁的机制,其中的T是对java heap中变量的修改提供类似于数据库事务的一种保护机制,和我要求的多线程&数据库事务没有半点关系。