国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 數(shù)據(jù)庫(kù) > MySQL > 正文

MySQL嵌套事務(wù)所遇到的問(wèn)題

2024-07-24 13:12:20
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

MySQL是支持嵌套事務(wù)的,但是沒(méi)多少人會(huì)這么干的…. 前段時(shí)間在國(guó)外看到一些老外在爭(zhēng)論MySQL嵌套事務(wù)的場(chǎng)景必要性。 逗死我了, 這嵌套的鬼畜用法還有啥場(chǎng)景必要性。   跟以前的dba同事聊過(guò), 得知,在任何場(chǎng)景下都不要使用MySQL嵌套的事務(wù)。

那么使用MySQL嵌套事務(wù)會(huì)遇到什么問(wèn)題 ?

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回滾了,但是數(shù)據(jù)顯示是  1 2 3  .    原本大家以為我的事務(wù)雖然是嵌套的狀態(tài),但感覺(jué)最后rollback回滾了,其實(shí)我們希望看到的結(jié)果是 子事務(wù)執(zhí)行成功,外層事務(wù)的失敗會(huì)回滾的。  但事實(shí)不是這樣的,最后的結(jié)果是  1 2 3 .

+-----+ | n   | +-----+ |  1 | |  2 | |  3 | +-----+ 

當(dāng)sql解釋器遇到 start transaction 時(shí)候會(huì)觸發(fā)commit… !!!   

begin_1  sql_1  begin_2  sql_2  sql_3 commit_1  rollback_1  .

begin_2 被執(zhí)行的時(shí)候, sql_1 已經(jīng)就被提交了, 當(dāng)你再去執(zhí)行commit_1的時(shí)候,那么sql_2 和 sql_3 就被提交了.    這時(shí)候你再去rollback,一定用都沒(méi)有….    因?yàn)橄惹岸继峤煌炅耍隳芑貪L啥…

前面說(shuō)過(guò) 在架構(gòu)上一般很少很少有人會(huì) 嵌套使用事務(wù),但有時(shí)候不小心被嵌套了。 我們拿python的項(xiàng)目來(lái)說(shuō),首先我們使用裝飾器來(lái)實(shí)現(xiàn)事務(wù)的包裝, 接著數(shù)據(jù)處理 def a() 和  def b() 函數(shù)都被事務(wù)被包裝起來(lái), 單純的用a 和 b 都沒(méi)關(guān)系,都是單事務(wù)。  如果 a 邏輯里又調(diào)用 b, 那么會(huì)發(fā)生什么?   對(duì)的,事務(wù)嵌套了…    我想這是絕大數(shù)業(yè)務(wù)開(kāi)發(fā)都會(huì)遇到的問(wèn)題。

那么怎么規(guī)避這風(fēng)險(xiǎn) ?  可以加鎖呀….   設(shè)立一個(gè)全局鎖,當(dāng)子事務(wù)創(chuàng)建前會(huì)判斷鎖的狀態(tài)….

如果你是flask的框架,可以使用 flask g 全局變量。  

如果是django框架, 那么可以使用 thread local使用全局變量。

如果是tornado、gevent這種異步io架構(gòu),可以使用 fd 做協(xié)程變量的關(guān)聯(lián)。

@decoratordef 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_transactiondef hide(self):  '''訂單不在app端顯示'''  if self.status not in OrderStatus.allow_deletion_statuses():    raise OrderStatusChangeNotAllowed(self.status, OrderStatus.deleted)...  @with_transactiondef change_receipt_info(self, address, name, phone):  region = Region.get_by_address(address)  ...

當(dāng)我們?nèi)?zhí)行下面語(yǔ)句的時(shí)候,事務(wù)會(huì)被強(qiáng)制提交.   當(dāng)然這里前提是 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  

注:相關(guān)教程知識(shí)閱讀請(qǐng)移步到MYSQL教程頻道。
發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 永川市| 额敏县| 紫金县| 富裕县| 晴隆县| 当阳市| 常宁市| 荔浦县| 武山县| 新绛县| 南城县| 韶山市| 信阳市| 阿巴嘎旗| 内黄县| 高雄市| 永平县| 阿巴嘎旗| 公安县| 巴南区| 仪陇县| 隆回县| 苏尼特左旗| 隆化县| 汝州市| 会理县| 兴义市| 新津县| 工布江达县| 什邡市| 炎陵县| 海淀区| 张掖市| 东乌珠穆沁旗| 沿河| 广昌县| 广昌县| 廊坊市| 沿河| 双柏县| 永顺县|