MySQL是支持嵌套事务的,但是没多少人会这么干的…. 前段时间在国外看到一些老外在争论MySQL嵌套事务的场景必要性。 逗死我了, 这嵌套的鬼畜用法还有啥场景必要性。 跟以前的dba同事聊过, 得知,在任何场景下都不要使用MySQL嵌套的事务。

那么使用MySQL嵌套事务会遇到什么问题 ?
mysql> select * from ceshi; +------+ | n | +------+ | 1 | +------+ 1 row in set (0.00 sec) mysql> start transaction ; Query OK, 0 rows affected (0.00 sec) mysql> insert into ceshi values(2); Query OK, 1 row affected (0.00 sec) mysql> start transaction ; Query OK, 0 rows affected (0.00 sec) mysql> insert into ceshi values(3); Query OK, 1 row affected (0.00 sec) mysql> commit; Query OK, 0 rows affected (0.00 sec) mysql> rollback; Query OK, 0 rows affected (0.00 sec)
虽然我在最后rollback回滚了,但是数据显示是 1 2 3 . 原本大家以为我的事务虽然是嵌套的状态,但感觉最后rollback回滚了,其实我们希望看到的结果是 子事务执行成功,外层事务的失败会回滚的。 但事实不是这样的,最后的结果是 1 2 3 .
+-----+ | n | +-----+ | 1 | | 2 | | 3 | +-----+
当sql解释器遇到 start transaction 时候会触发commit… !!!
begin_1 sql_1 begin_2 sql_2 sql_3 commit_1 rollback_1 .
begin_2 被执行的时候, sql_1 已经就被提交了, 当你再去执行commit_1的时候,那么sql_2 和 sql_3 就被提交了. 这时候你再去rollback,一定用都没有…. 因为先前都提交完了,你能回滚啥…
前面说过 在架构上一般很少很少有人会 嵌套使用事务,但有时候不小心被嵌套了。 我们拿python的项目来说,首先我们使用装饰器来实现事务的包装, 接着数据处理 def a() 和 def b() 函数都被事务被包装起来, 单纯的用a 和 b 都没关系,都是单事务。 如果 a 逻辑里又调用 b, 那么会发生什么? 对的,事务嵌套了… 我想这是绝大数业务开发都会遇到的问题。
那么怎么规避这风险 ? 可以加锁呀…. 设立一个全局锁,当子事务创建前会判断锁的状态….
如果你是flask的框架,可以使用 flask g 全局变量。
如果是django框架, 那么可以使用 thread local使用全局变量。
如果是tornado、gevent这种异步io架构,可以使用 fd 做协程变量的关联。
@decorator
def with_transaction(f, *args, **kwargs):
db = connection.get_db_by_table("*")
try:
db.begin()
ret = f(*args, **kwargs)
db.commit()
except:
db.rollback()
raise
return ret
@with_transaction
def hide(self):
'''订单不在app端显示'''
if self.status not in OrderStatus.allow_deletion_statuses():
raise OrderStatusChangeNotAllowed(self.status, OrderStatus.deleted)
...
@with_transaction
def change_receipt_info(self, address, name, phone):
region = Region.get_by_address(address)
...
当我们去执行下面语句的时候,事务会被强制提交. 当然这里前提是 autocommit = True 。
ALTER FUNCTION ALTER PROCEDURE ALTER TABLE BEGIN CREATE DATABASE CREATE FUNCTION CREATE INDEX CREATE PROCEDURE CREATE TABLE DROP DATABASE DROP FUNCTION DROP INDEX DROP PROCEDURE DROP TABLE UNLOCK TABLES LOAD MASTER DATA LOCK TABLES RENAME TABLE TRUNCATE TABLE SET AUTOCOMMIT=1 START TRANSACTION
# mysql嵌套查询
# mysql
# 游标嵌套
# 嵌套子查询
# PHP中实现MySQL嵌套事务的两种解决方案
# MySQL存储过程例子(包含事务
# 输出参数
# 嵌套调用)
# 可以使用
# 再去
# 人会
# 都是
# 这是
# 全局变量
# 我想
# 我在
# 你是
# 结果是
# 都没
# 当你
# 说过
# 你能
# 上一
# 我了
# 数据处理
# 当我们
# 在国外
# 来实现
相关文章:
在线流程图制作网站手机版,谁能推荐几个好的CG原画资源网站么?
详解免费开源的.NET多类型文件解压缩组件SharpZipLib(.NET组件介绍之七)
想学网站制作怎么学,建立一个网站要花费多少?
如何批量查询域名的建站时间记录?
建站中国官网:模板定制+SEO优化+建站流程一站式指南
大同网页,大同瑞慈医院官网?
建站主机是否属于云主机类型?
如何挑选优质建站一级代理提升网站排名?
厦门模型网站设计制作公司,厦门航空飞机模型掉色怎么办?
如何快速辨别茅台真假?关键步骤解析
免费网站制作模板下载,除了易企秀之外还有什么H5平台可以制作H5长页面,最好是免费的?
如何在阿里云域名上完成建站全流程?
免费制作小说封面的网站有哪些,怎么接网站批量的封面单?
电商网站制作价格怎么算,网上拍卖流程以及规则?
Android自定义控件实现温度旋转按钮效果
如何用IIS7快速搭建并优化网站站点?
韩国服务器如何优化跨境访问实现高效连接?
如何通过VPS搭建网站快速盈利?
网站制作培训多少钱一个月,网站优化seo培训课程有哪些?
如何快速搭建安全的FTP站点?
如何使用Golang安装API文档生成工具_快速生成接口文档
,购物网站怎么盈利呢?
网站企业制作流程,用什么语言做企业网站比较好?
网站制作专业公司有哪些,如何制作一个企业网站,建设网站的基本步骤有哪些?
完全自定义免费建站平台:主题模板在线生成一站式服务
如何快速完成中国万网建站详细流程?
寿县云建站:智能SEO优化与多行业模板快速上线指南
洛阳网站制作公司有哪些,洛阳的招聘网站都有哪些?
深圳网站制作的公司有哪些,dido官方网站?
Thinkphp 中 distinct 的用法解析
我的世界制作壁纸网站下载,手机怎么换我的世界壁纸?
移民网站制作流程,怎么看加拿大移民官网?
如何通过商城自助建站源码实现零基础高效建站?
建站之星如何通过成品分离优化网站效率?
北京网站制作的公司有哪些,北京白云观官方网站?
建站主机核心功能解析:服务器选择与网站搭建流程指南
新网站制作渠道有哪些,跪求一个无线渠道比较强的小说网站,我要发表小说?
建站ABC备案流程中有哪些关键注意事项?
北京网页设计制作网站有哪些,继续教育自动播放怎么设置?
建站之星免费模板:自助建站系统与智能响应式一键生成
宝华建站服务条款解析:五站合一功能与SEO优化设置指南
建站之星价格显示格式升级,你的预算足够吗?
建站DNS解析失败?如何正确配置域名服务器?
,网页ppt怎么弄成自己的ppt?
图片制作网站免费软件,有没有免费的网站或软件可以将图片批量转为A4大小的pdf?
子杰智能建站系统|零代码开发与AI生成SEO优化指南
建站之星代理如何获取技术支持?
导航网站建站方案与优化指南:一站式高效搭建技巧解析
如何用美橙互联一键搭建多站合一网站?
*请认真填写需求信息,我们会在24小时内与您取得联系。