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(); }