多线程共享MySQL连接时,使用事务的危险!
来源:互联网 发布:纸牌屋简宁 知乎 编辑:程序博客网 时间:2024/05/21 13:58
转自: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连接妥当些。如果你觉得这样比较奢侈,数据库连接池是个可以考虑的方案!
- 多线程共享MySQL连接时,使用事务的危险!
- mysql的共享连接
- Spring里多线程共享事务的问题
- mysql:day5-详解多线程状态下的事务(连接池、动态代理技术)
- MySQL的事务、连接池以及数据源
- 多线程危险
- 使用python多线程连接mysql数据库
- 使用proxool连接sybase时处理事务的问题
- 多线程中的使用共享变量的问题
- 多线程中的使用共享变量的问题
- 多线程中的使用共享变量的问题
- 多线程中的使用共享变量的问题
- Mybatis连接MySql时,出现的MySql版本问题(read only数据库事务)
- OpenResty 中不当使用 MySQL 连接池导致事务被回滚
- 多线程 —— 一个“危险”的程序
- mysql的连接使用
- MySQL 连接的使用
- Mysql 连接的使用
- 海量存储之一
- jbpm5 介绍
- CentOS6.2搭建使用Radius认证的OpenVPN
- 计算机专业就业分析
- Wireshark学习总结
- 多线程共享MySQL连接时,使用事务的危险!
- 嵌入式Linux系统下I2C设备驱动程序的开发
- 最长公共子串
- Servlet过滤器
- VB中怎么模拟键盘按Shift+1键???
- 安装“浪潮睿捷服务器”操作系统的收获
- js常用小技巧(实用)
- 再谈js原型继承
- 您对无法重新创建的表进行了更改或者启用了“阻止保存要求重新创建表的更改”选项