大战熟女丰满人妻av-荡女精品导航-岛国aaaa级午夜福利片-岛国av动作片在线观看-岛国av无码免费无禁网站-岛国大片激情做爰视频

專注Java教育14年 全國咨詢/投訴熱線:400-8080-105
動力節點LOGO圖
始于2009,口口相傳的Java黃埔軍校
首頁 hot資訊 淺談MySQL自動提交模式

淺談MySQL自動提交模式

更新時間:2021-01-25 17:10:55 來源:動力節點 瀏覽1420次

默認情況下, MySQL啟用自動提交模式(變量autocommit為ON)。這意味著, 只要你執行DML操作的語句,MySQL會立即隱式提交事務(Implicit Commit)。如果你了解SQL Server數據庫的話,你會發現MySQL自動提交模式跟SQL Server有很多相似之處。

 

1 .MySQL的autocommit設置

MySQL默認是開啟自動提交的,即每一條DML(增刪改)語句都會被作為一個單獨的事務進行隱式提交。如果修改為關閉狀態,則執行DML語句之后要手動提交 才能生效。
查詢當前會話的自動提交是否開啟:

mysql> show variables like 'autocommit';

+---------------+-------+

| Variable_name | Value |

+---------------+-------+

| autocommit    | ON    |

+---------------+-------+

查詢全局的自動提交是否開啟:

mysql> show global variables like 'autocommit';

+---------------+-------+

| Variable_name | Value |

+---------------+-------+

| autocommit    | ON    |

+---------------+-------+

通過修改autocommit變量可以關閉和開啟操作

關閉當前會話的自動提交模式

mysql> set autocommit=0;

 

 

mysql> show variables like 'autocommit';

+---------------+-------+

| Variable_name | Value |

+---------------+-------+

| autocommit    | OFF   |

+---------------+-------+

 

 全局的autocommit還是開啟狀態

mysql> show global variables like 'autocommit';

+---------------+-------+

| Variable_name | Value |

+---------------+-------+

| autocommit    | ON    |

+---------------+-------+

 

 

 關閉全局的autocommit

mysql> set global autocommit=0;

 

 

mysql> show global variables like 'autocommit';

+---------------+-------+

| Variable_name | Value |

+---------------+-------+

| autocommit    | OFF   |

+---------------+-------+

如果想要MySQL服務重啟之后仍能生效,需要設置系統環境變量。MySQL5.7 在cnf配置文件中[mysqld]下面設置autocommit的值。

[mysqld]

...

autocommit=0

 

 

2.修改autocommit模式

mysql> set session autocommit=0;

Query OK, 0 rows affected (0.00 sec)

 

mysql> show session variables like 'autocommit';

+---------------+-------+

| Variable_name | Value |

+---------------+-------+

| autocommit    | OFF   |

+---------------+-------+

1 row in set (0.00 sec)

 

mysql> show global variables like 'autocommit';

+---------------+-------+

| Variable_name | Value |

+---------------+-------+

| autocommit    | ON    |

+---------------+-------+

1 row in set (0.00 sec)

 

mysql>

 

mysql> set global autocommit=0;

Query OK, 0 rows affected (0.00 sec)

 

mysql> show global variables like 'autocommit';

+---------------+-------+

| Variable_name | Value |

+---------------+-------+

| autocommit    | OFF   |

+---------------+-------+

1 row in set (0.01 sec)

 

mysql> 注意,上述SQL修改會話系統變量或全局系統變量,只對當前實例有效,如果MySQL服務重啟的話,這些設置就會丟失,如果要永久生效,就必須在配置文件中修改系統變量。[mysqld]

autocommit=0不過網上還有種方式,如下所示,在MySQL 5.6/5.7下測試,發現不生效,查了一下,這種方式似乎從MySQL 5.6開始已經不生效了,必須用autocommit=0這種方式替換。[mysqld]

init_connect='SET autocommit=0'

 

3.Spring中MySQL對自動提交的控制

MySQL的JDBC驅動包 mysql-connector-java 會給會話的connection默認開啟自動提交,譬如 mysql-connector-java-8.0.22版本的代碼:

//com.mysql.cj.protocol.a.NativeServerSession.java

    private boolean autoCommit = true;

常用的數據庫連接池 如HikariCP,druid等,默認也是開啟自動提交,會將connection的自動提交設置都改為true。
druid在初始化DataSource的時候設置connection的autocommit為true。代碼如下:

com.alibaba.druid.pool.DruidAbstractDataSource.java

    protected volatile boolean                         defaultAutoCommit                         = true;

    ...

    public void initPhysicalConnection(Connection conn, Map<String, Object> variables, Map<String, Object> globalVariables) throws SQLException {

        if (conn.getAutoCommit() != defaultAutoCommit) {

           //將connection的autocommit設置為true

            conn.setAutoCommit(defaultAutoCommit);

        }

        ...

 

    }

HikariCP 初始化DataSource的默認配置 中autocommit也是true:

com.zaxxer.hikari.HikariConfig.java

   public HikariConfig()

   {

      ...

      isAutoCommit = true;

   }

對于事務管理器PlatformTransactionManager管理的顯式事務(譬如@Transactional注解聲明)在 開啟事務時會關閉自動提交模式。

代碼如下:

@Override

protected void doBegin(Object transaction, TransactionDefinition definition) {

DataSourceTransactionObject txObject = (DataSourceTransactionObject) transaction;

Connection con = null;

 

try {

             ........

 

// Switch to manual commit if necessary. This is very expensive in some JDBC drivers,

// so we don't want to do it unnecessarily (for example if we've explicitly

// configured the connection pool to set it already).

if (con.getAutoCommit()) {

txObject.setMustRestoreAutoCommit(true);

if (logger.isDebugEnabled()) {

logger.debug("Switching JDBC Connection [" + con + "] to manual commit");

}

                                //關閉自動提交模

                                con.setAutoCommit(false);

}

 

            .......

}

 

catch (Throwable ex) {

          .......

}

}

 

MySQL的autocommit模式默認是打開狀態,為了防止手動的DML操作導致失誤,生產環境可以設置為默認關閉的狀態。一般的JDBC連接池默認都是開啟狀態,而且是可配置的。顯式事務下會設置成關閉狀態,單純的修改數據庫環境的autocommit不會對代碼的行為產生影響。因此,MySQL的自動提交模式還是很值得信賴的,自動提交模式可以通過服務器變量AUTOCOMMIT來控制,且不會對顯式事務造成影響。在本站的MySQL教程中,有著對MySQL自動提交模式的詳細講解,還沒有弄通透的小伙伴可以前去觀看學習哦。

 

 

提交申請后,顧問老師會電話與您溝通安排學習

免費課程推薦 >>
技術文檔推薦 >>
主站蜘蛛池模板: 男人的天堂在线精品视频 | 女性成人毛片a级 | 婷婷综合久久狠狠色99h | 精品一精品国产一级毛片 | 色综合天天综合网亚洲影院 | 视频一区国产 | 欧洲在线免费视频 | 欧美99热| 91久久视频 | 伊人久久伊人 | 色啦啦在线观看 | 日本中文在线播放 | 亚洲成 人a影院青久在线观看 | 一级成人生活片免费看 | 夜夜爽天天狠狠九月婷婷 | 亚洲和欧美毛片久久久久 | 四虎亚洲国产成人久久精品 | 亚洲欧美日韩国产一区二区精品 | 亚洲另类图区 | 五月花精品视频在线观看 | 久久精品国产福利 | 成人欧美一级毛片免费观看 | 久久青草精品一区二区三区 | 亚洲欧美一二三区 | 欧美性猛交ⅹxxx乱大交免费 | 成熟性xxxxx 成在线人免费视频一区二区三区 | 欧美videofree高清杂交 | 亚洲综合一区二区精品久久 | 四虎影院免费观看 | 青青青国产在线视频 | 欧美日韩视频在线第一区 | 天天摸日日 | 狠狠色噜噜狠狠狠狠97 | 久久精品亚洲一区二区 | 成人a大片高清在线观看 | 国产视频最新 | 欧美国产日韩精品 | chinese456老人gay| 欧美成人免费xxx大片 | 亚洲日本欧美产综合在线 | 欧美成人极品怡红院tv |