欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

MySQL嵌套事務所遇到的問題

 更新時間:2017年02月26日 10:49:42   作者:rfyiamcool  
這篇文章主要介紹了MySQL嵌套事務所遇到的問題的相關資料,需要的朋友可以參考下

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

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

當sql解釋器遇到 start transaction 時候會觸發(fā)commit… !!!   

begin_1  sql_1  begin_2  sql_2  sql_3 commit_1  rollback_1  .

begin_2 被執(zhí)行的時候, sql_1 已經(jīng)就被提交了, 當你再去執(zhí)行commit_1的時候,那么sql_2 和 sql_3 就被提交了.    這時候你再去rollback,一定用都沒有….    因為先前都提交完了,你能回滾啥…

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

那么怎么規(guī)避這風險 ?  可以加鎖呀….   設立一個全局鎖,當子事務創(chuàng)建前會判斷鎖的狀態(tài)….

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

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

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

@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)
  ...

當我們?nèi)?zhí)行下面語句的時候,事務會被強制提交.   當然這里前提是 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中的COLLATE

    深入MYSQL中的COLLATE

    MYSQL COLLATE是用于指定字符集的排序規(guī)則的關鍵詞,它可以用于在查詢中對字符數(shù)據(jù)進行排序和比較,具有一定的參考價值,感興趣的可以了解一下
    2023-08-08
  • 使用mysql事件調(diào)度器定時刪除binlog

    使用mysql事件調(diào)度器定時刪除binlog

    MySQL5.1.6起Mysql增加了事件調(diào)度器(Event Scheduler),可以用做定時執(zhí)行某些特定任務,來取代原先只能由操作系統(tǒng)的計劃任務來執(zhí)行的工作
    2014-03-03
  • MySql批量插入時如何不重復插入數(shù)據(jù)

    MySql批量插入時如何不重復插入數(shù)據(jù)

    Mysql插入不重復的數(shù)據(jù),當大數(shù)據(jù)量的數(shù)據(jù)需要插入值時,要判斷插入是否重復,然后再插入,那么如何提高效率,本文就詳細的介紹一下,感興趣的可以了解一下
    2021-06-06
  • MySQL分頁優(yōu)化

    MySQL分頁優(yōu)化

    這篇文章主要為大家詳細介紹了MySQL分頁優(yōu)化,內(nèi)容思路很詳細,有意對MySQL分頁優(yōu)化的朋友可以參考一下
    2016-04-04
  • 理解MySQL——索引與優(yōu)化總結

    理解MySQL——索引與優(yōu)化總結

    本篇文章主要介紹了MySQL——索引與優(yōu)化,索引對查詢的速度有著至關重要的影響,理解索引也是進行數(shù)據(jù)庫性能調(diào)優(yōu)的起點。有興趣的可以了解一下。
    2016-12-12
  • MySQL修改my.cnf配置不生效的解決方法

    MySQL修改my.cnf配置不生效的解決方法

    這篇文章主要介紹了MySQL修改my.cnf配置不生效的解決方法,簡單分析了配置文件的執(zhí)行順序與原理并提出解決方法,需要的朋友可以參考下
    2016-04-04
  • mysql多條數(shù)據(jù)合并成一條的3種常見方法

    mysql多條數(shù)據(jù)合并成一條的3種常見方法

    在實際的應用開發(fā)中,有時我們需要將多條數(shù)據(jù)合并成一條數(shù)據(jù),以便更好地進行數(shù)據(jù)分析和處理,本文就來介紹一下mysql多條數(shù)據(jù)合并成一條的方法,具有一定的參考價值
    2023-10-10
  • 在linux或unix服務器上安裝、使用MySQL的注意事項

    在linux或unix服務器上安裝、使用MySQL的注意事項

    在linux或unix服務器上安裝、使用MySQL的注意事項,需要的朋友可以參考下,使用windows服務器的朋友可以到s.jb51.net下載相關軟件
    2012-01-01
  • MySQL如何比較時間(datetime)大小

    MySQL如何比較時間(datetime)大小

    這篇文章主要介紹了MySQL如何比較時間(datetime)大小,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • MySQL?條件查詢詳解

    MySQL?條件查詢詳解

    這篇文章主要介紹了MySQL條件查詢,本文通過示例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-05-05

最新評論