更新時間: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自動提交模式的詳細講解,還沒有弄通透的小伙伴可以前去觀看學習哦。
0基礎 0學費 15天面授
有基礎 直達就業
業余時間 高薪轉行
工作1~3年,加薪神器
工作3~5年,晉升架構
提交申請后,顧問老師會電話與您溝通安排學習