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

本文分析了在多线程环境下使用MySQL事务的潜在风险,并提出了有效的预防措施,建议每个线程建立独立的MySQL连接以避免事务冲突。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

转自: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连接妥当些。如果你觉得这样比较奢侈,数据库连接池是个可以考虑的方案!  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值