婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > MySQL嵌套事務所遇到的問題

MySQL嵌套事務所遇到的問題

熱門標簽:dq8 全地圖標注 永州智能外呼系統 趙縣地圖標注 哈爾濱云外呼系統運營商 邯鄲400電話注冊辦理 地圖標注直通車 遂寧400電話申請 南寧智能電銷機器人價格 電銷機器人市場價

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  

您可能感興趣的文章:
  • PHP中實現MySQL嵌套事務的兩種解決方案
  • MySQL存儲過程例子(包含事務,輸出參數,嵌套調用)

標簽:阿里 鄂州 浙江 上海 定西 張家界 南寧 中衛

巨人網絡通訊聲明:本文標題《MySQL嵌套事務所遇到的問題》,本文關鍵詞  MySQL,嵌套,事務所,遇到,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《MySQL嵌套事務所遇到的問題》相關的同類信息!
  • 本頁收集關于MySQL嵌套事務所遇到的問題的相關信息資訊供網民參考!
  • 推薦文章
    主站蜘蛛池模板: 碌曲县| 五家渠市| 防城港市| 八宿县| 兴宁市| 江华| 柏乡县| 安仁县| 洛宁县| 荆州市| 甘孜县| 洛扎县| 蓬溪县| 石城县| 岐山县| 剑河县| 彭阳县| 康保县| 马公市| 刚察县| 封丘县| 田林县| 昌都县| 盐津县| 阜平县| 斗六市| 遂溪县| 汉中市| 北川| 巴彦淖尔市| 吉水县| 万全县| 永丰县| 西乌珠穆沁旗| 宁强县| 平邑县| 岳阳市| 拉孜县| 双流县| 陆丰市| 景宁|