MySQL默认操作模式就是autocommit自动提交模式,我们可以通过设置autocommit的值改变是否是自动提交autocommit模式。
通过以下命令可以查看当前autocommit模式:
show variables like 'autocommit';
查询结果:
查询结果为ON,表示autocommit开启。我们可以通过下面两种SQL语句关闭自动提交模式
set autocommit = 1;
set autocommit = 'off';
值0和off都是一样的,运行上面的sql用户将一直处于某个事务中,直到执行一条commit提交或rollback语句才会结束当前事务重新开始一个新的事务。SQL语句如下
提交:
commit;
回滚:
ROLLBACK;
举个例子,张三给李四转账400元。那么在数据库中应该是以下操作:
1,先查询张三的账户余额是否足够
2,张三的账户上减去400元
3,李四的账户上加上400元
以上三个步骤就可以放在一个事务中执行提交,要么全部执行要么全部不执行,如果一切都OK就commit提交永久性更改数据;如果出错则rollback回滚到更改前的状态。利用事务处理就不会出现张三的钱少了李四的账户却没有增加400元或者张三的钱没有减去李四的账户却加了400元。
注意:
MySQL默认的存储引擎是MyISAM,MyISAM存储引擎不支持事务处理,所以改变autocommit没有什么作用。但不会报错,所以要使用事务处理的童鞋一定要确定你所操作的表示支持事务处理的,如InnoDB。如果不知道表的存储引擎可以通过查看建表语句查看建表的时候有没有指定事务类型的存储引擎,如果没有指定存储引擎默认则是MyISAM不支持事务的存储引擎。
当然,事务处理是为了保障表数据原子性、一致性、隔离性、持久性。这些都是要消耗系统资源的,要谨慎选择。
Java程序中如何使用事物
在java操作数据库是,为了保证数据的一致性,比如转账操作,从一个账户减掉10元,在另一个账户加上10元。
在类中定义的成员属性(变量)不用赋初值,但在函数里头定义的变量就一定要赋初值。
package com.test;
import java.sql.*;
public class Test {
public static void main(String[] args) {
//怎么把多个dml语句看做一个整体事物,统一提交
Connection ct = null;
try {
String sql1="update emp set sal=sal-10 where empno=7369";
String sql2="update emp set sal=sal+10 where empno=7499";
//得到一个连接
ct=SQLHelper.getConnection();
//把事物设为不自动提交
ct.setAutoCommit(false);
PreparedStatement ps1=ct.prepareStatement(sql1);
PreparedStatement ps2=ct.prepareStatement(sql2);
ps1.executeUpdate();
int i=90/0;
ps2.executeUpdate();
//把两个操作看做一个事物统一提交
ct.commit();
} catch (Exception e) {
e.printStackTrace();
//如果事物出现了异常,我们可以回滚(相当于这个事物所有操作全部取消)
try {
ct.rollback();
} catch (Exception e1) {
e1.printStackTrace();
}
}finally{
}
}
}