• 首页
  • vue
  • TypeScript
  • JavaScript
  • scss
  • css3
  • html5
  • php
  • MySQL
  • redis
  • jQuery
  • 自动提交,提交和回滚(START TRANSACTION、COMMIT、 ROLLBACK)

    在中InnoDB,所有用户活动都发生在交易内部。如果autocommit启用了mode,则每个SQL语句将自己形成一个事务。默认情况下,MySQL为autocommit启用的每个新连接启动会话,因此,如果该SQL语句未返回错误,则MySQL在每个SQL语句之后进行提交。如果一条语句返回错误,则提交或回退行为取决于该错误。请参见“ InnoDB错误处理”。

    具有会话autocommit启用可以通过显式启动它执行多语句事务START TRANSACTIONBEGIN语句,并用它结束COMMITROLLBACK声明。请参见“ START TRANSACTION,COMMIT和ROLLBACK语句”。

    如果autocommit在与SET autocommit = 0的会话中禁用了mode ,则该会话始终会打开一个事务。一个COMMITROLLBACK语句结束当前事务和一个新的开始。

    如果autocommit禁用的会话在没有显式提交最终事务的情况下结束,则MySQL将回滚该事务。

    某些语句隐式结束事务,就好像您COMMIT在执行该语句之前已经完成了。有关详细信息,请参见“START TRANSACTION,COMMIT和ROLLBACK语句”。

    COMMIT意味着当前事务中所做的更改将永久化,并且对其他会话可见。一个ROLLBACK声明,而另一方面,取消当前事务中的所有修改。双方COMMITROLLBACK释放所有InnoDB当前事务期间设置的锁。

    将DML操作与事务分组

    默认情况下,连接到MySQL服务器开始与自动提交模式下启用,当你执行它自动提交每个SQL语句。如果您有其他数据库系统的经验,则可能不熟悉这种操作方式,在标准实践中,发出一系列 DML语句并提交它们或将它们全部回滚。

    要使用多语句事务,请使用SQL语句关闭自动提交功能,SET autocommit = 0并使用COMMITROLLBACK根据需要结束每个事务。要保留自动提交功能,请以开始每个交易,START TRANSACTION并以COMMIT或结束交易ROLLBACK。以下示例显示了两个事务。第一个是承诺;第二个是承诺。第二个回滚。

    shell>mysql test
    
    mysql> CREATE TABLE customer (a INT, b CHAR (20), INDEX (a));
    Query OK, 0 rows affected (0.00 sec)
    mysql> -- Do a transaction with autocommit turned on.
    mysql> START TRANSACTION;
    Query OK, 0 rows affected (0.00 sec)
    mysql> INSERT INTO customer VALUES (10, 'Heikki');
    Query OK, 1 row affected (0.00 sec)
    mysql> COMMIT;
    Query OK, 0 rows affected (0.00 sec)
    mysql> -- Do another transaction with autocommit turned off.
    mysql> SET autocommit=0;
    Query OK, 0 rows affected (0.00 sec)
    mysql> INSERT INTO customer VALUES (15, 'John');
    Query OK, 1 row affected (0.00 sec)
    mysql> INSERT INTO customer VALUES (20, 'Paul');
    Query OK, 1 row affected (0.00 sec)
    mysql> DELETE FROM customer WHERE b = 'Heikki';
    Query OK, 1 row affected (0.00 sec)
    mysql> -- Now we undo those last 2 inserts and the delete.
    mysql> ROLLBACK;
    Query OK, 0 rows affected (0.00 sec)
    mysql> SELECT * FROM customer;
    +------	+--------	+
    | a    	| b      	|
    +------	+--------	+
    |   10 	| Heikki 	|
    +------	+--------	+
    1 row in set (0.00 sec)
    mysql>
    
    客户端语言中的事务

    在诸如PHP,Perl DBI,JDBC,ODBC或MySQL的标准C调用接口之类的API中,您可以COMMIT像其他任何SQL语句(如SELECT或)一样,将事务控制语句(如字符串)发送到MySQL服务器INSERT。一些API还提供了单独的特殊事务提交和回滚功能或方法。