一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

Mysql|Sql Server|Oracle|Redis|MongoDB|PostgreSQL|Sqlite|DB2|mariadb|Access|數據庫技術|

服務器之家 - 數據庫 - Mysql - 詳解MySQL與Spring的自動提交(autocommit)

詳解MySQL與Spring的自動提交(autocommit)

2021-03-31 17:28矚目學碼 Mysql

這篇文章主要介紹了MySQL與Spring的自動提交(autocommit)的的相關資料,幫助大家更好的理解和使用MySQL與spring,感興趣的朋友可以了解下

1 MySQL的autocommit設置

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

?
1
2
3
4
5
6
mysql> show variables like 'autocommit';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| autocommit  | ON  |
+---------------+-------+

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

?
1
2
3
4
5
6
mysql> show global variables like 'autocommit';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| autocommit  | ON  |
+---------------+-------+

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
關閉當前會話的自動提交模式
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的值。

?
1
2
3
[mysqld]
...
autocommit=0

Spring中對自動提交的控制

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

?
1
2
//com.mysql.cj.protocol.a.NativeServerSession.java
  private boolean autoCommit = true;

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

?
1
2
3
4
5
6
7
8
9
10
11
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:

?
1
2
3
4
5
6
com.zaxxer.hikari.HikariConfig.java
  public HikariConfig()
  {
   ...
   isAutoCommit = true;
  }

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
@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與Spring的自動提交(autocommit)的詳細內容,更多關于MySQL 自動提交(autocommit)的資料請關注服務器之家其它相關文章!

原文鏈接:https://juejin.cn/post/6916415803852062734

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 女人张开腿让男人桶爽 | 亚洲天堂网站在线 | naruto tube18动漫 mm131亚洲精品久久 | 小舞同人18av黄漫网站 | 国产卡一卡二卡三乱码手机 | 欧美精品一区二区三区免费 | 2020韩国三级理论在线观看 | 好吊色视频988gao在线观看 | 亚洲国产成人久久精品hezyo | 好大好硬好深好爽想要之黄蓉 | 韩国甜性涩爱免费观看 | 亚洲视频观看 | 久久精品中文闷骚内射 | 久久99re2在线视频精品 | 国产美女下面流出白浆视频 | 午夜爱爱爱爱爽爽爽视频网站 | 国产亚洲福利一区二区免费看 | 国产美女亚洲精品久久久综合 | 久久视频这有精品63在线国产 | 亚洲首页国产精品丝袜 | 99久久免费看国产精品 | cos美女被黄网站 | 校园春色自拍偷拍 | 99久久精品免费精品国产 | 欧美夫妇野外交换hd高清版 | 四虎传媒 | 黑人巨大和日本娇小中出 | 极品虎白女在线观看一线天 | 亚洲可乐操 | 日韩播放| 成人精品亚洲人成在线 | 男人猛进猛出女人下面视频 | 国产91区 | 天美影视文化传媒mv免费 | 私人黄色影院 | 日本黄色一区 | 色噜噜狠狠狠综合曰曰曰88av | 国产xxx在线 | 成人免费观看一区二区 | www日本在线观看 | 波多野结衣在线免费观看 |