MySQL数据库的事务

1、MySQL数据库的事务

在MySQL数据库中,事务默认是会自动提交的,也就是说,如果没有用 begin ... commit 来显式提交事务的话,MySQL 会认为每一条SQL语句都是一个事务,也就是每一条SQL语句都会自动提交。另外,Oracle数据库默认是不会自动提交事务的,也就是必须得显式地commit,SQL才会生效。

我们可以通过下面的语句来查询是否自动提交事务:

SELECT @@autocommit;   -- 结果为1表示自动提交,0表示不是自动提交

查询结果:

可以看到默认是为自动提交的。

也可以通过下面语句来设置不自动提交事务

SET @@autocommit = 0;

当设置为不自动提交事务后,每一条 SQL 语句都需要显式地使用 commit 来提交才行,不然的话不会持久性地作用到数据库中。

UPDATE websites SET websites.alexa = 444 WHERE websites.id = 1;
COMMIT;  -- 当设置为不自动提交时,必须得显式地commit,SQL才会提交,起持久性作用。否则执行上面的update语句数据库也不会被更新

 2、处理事务

在 MYSQL 中事务处理主要有两种方法:

1)用 BEGIN, ROLLBACK, COMMIT来实现

  • BEGIN 开始一个事务
  • ROLLBACK 事务回滚
  • COMMIT 事务确认
BEGIN;  -- MySQL中也可以用START TRANSACTION
UPDATE accounts SET balance = balance - 100 WHERE id = 1;
UPDATE accounts SET balance = balance + 100 WHERE id = 2;
COMMIT;

2)直接用 SET 来改变 MySQL 的自动提交模式。因为在MySQL中,默认自动提交事务,也就是任意一条SQL语句都会被当做是一个事务,并且自动提交,所以如果不使用 begin .. commit 的话,在MySQL中需要将自动提交关闭掉。

  • SET AUTOCOMMIT=0 禁止自动提交
  • SET AUTOCOMMIT=1 开启自动提交
Connection conn = openConnection();
try {
    // 关闭自动提交:
    conn.setAutoCommit(false);
    // 执行多条SQL语句:
    insert(); update(); delete();
    // 提交事务:
    conn.commit();
} catch (SQLException e) {
    // 回滚事务:
    conn.rollback();
} finally {
    conn.setAutoCommit(true);  //最后恢复至自动提交
    conn.close();
}
原文地址:https://www.cnblogs.com/wenxuehai/p/15042188.html