现在的位置: 首页 > 综合 > 正文

多线程共享MySQL连接时,使用事务的危险!

2013年10月16日 ⁄ 综合 ⁄ 共 786字 ⁄ 字号 评论关闭

转自:http://hi.baidu.com/igarry/item/ab87470f5478e231a2332a7e

在多线程程序中,多个线程共享一个MySQL连接是很常见的!如今MySQL(我使用的是MySQL 5.0.51a)只要选择BDB或者InnoDB建表(二者区别:BDB支持页级锁定,InnoDB支持行级锁定),即具备事务处理能力!然而,在多线程共享一个MySQL连接时,使用事务却存在的诸多危险,分析如下!
假设有两个线程Thread A, Thread B共享一个MySQL连接,两个线程分别有如下的执行语句:
情形一:
Thread A:
START TRANSACTION; //开始执行事务
EXECUTE SQL STATEMENT 1;
EXECUTE SQL STATEMENT 2;
ROLLBACK; //回滚事务

Thread B:
EXECUTE SQL STATEMENT 3;

如果Thread B中的SQL STATEMENT 3比Thread A的ROLLBACK先执行,则Thread B的SQL STATEMENT 3将被回滚,而这显然不是我们需要的!

情形二:
Thread A:
START TRANSACTION; //开始事务
EXECUTE SQL STATEMENT 1;
EXECUTE SQL STATEMENT 2;
COMMIT/ROLLBACK; //提交/回滚事务

Thread B:
COMMIT;

如果Thread B中的COMMIT动作发生在Thread A的SQL STATEMENT 1与SQL STATEMENT 2之间,则使事务失效,同样不是我们想要的!

当然还有更复杂的,比如多个线程都在进行事务,我就不分析了!

因此,在多线程共享MySQL连接时,使用事务是非常危险的,建议避免使用!如果涉及到MySQL的事务,一个线程建立一个MySQL连接妥当些。如果你觉得这样比较奢侈,数据库连接池是个可以考虑的方案!  

抱歉!评论已关闭.