MySQL事务
1.基本概念
(1)事务:指逻辑上的一组操作,组成这组操作的各个单元,要么全部成功,要么全部失败。
注:1).MySQL引擎是支持事务的
2).MySQL默认自动提交事务,并且每条语句都处于单独的事务中。
(2)手动控制事务的三个步骤:
a.开启事务 start transaction 或者 begin;
b.提交事务 commit; //提交后事务才会提交到磁盘上,没有提交就会存到内存中。
c.回滚事务 rollback;//如果事务不提交,执行rollback,则会恢复到事务原本的状态。
2.JDBC控制事务的方式
Connection conn = null;
PreparedStatement ps = null;
try {
conn = DBUtils.getConnection();
conn.setAutoCommit(false);//开启事务,相当于begin
ps = conn.prepareStatement("update account set money=money-100 where name ='aaa'");
ps.executeUpdate();
//int i = 10/0;//用来测试rollback的功能
ps = conn.prepareStatement("update account set money=money+100 where name ='bbb'");
ps.executeUpdate();
conn.commit();//提交事务
} catch (Exception e) {
try {
conn.rollback();
} catch (SQLException e1) {
e1.printStackTrace();
}
e.printStackTrace();
}finally {
DBUtils.closeAll(null, ps, conn);
}
3.事务的特性:******
1)原子性:指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。
2)一致性:事务必须使数据库从一个一致性状态变换到另外一个一致性状态,即总的数据不变。
3)隔离性:事务的隔离性是多个用户并发访问数据库时,数据库为每一个用户开启的事务,不能被其他事务的操作数据所干扰,多个并发事务之间要相互隔离。
4)永久性:指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来即使数据库发生故障也不应该对其有任何影响。
4.在操作事务时可能会出现的状况:
1)脏读:读到另一个事务未提交的数据
2)不可重复:一个事务读取到了另一个事务提交的数据(因为一个事务只能在提交后才能读取到另一个事务提交的数据),表现为在一个事务内读取表中的某一行数据,多次读取结果不同。
发生在update语句中。
3)虚读/幻读:指一个事务读取到另一个事务插入(insert)的数据,导致前后读取的结果不同;
5.事务的隔离级别
数据库通过设置事务的隔离级别防止上述情况的发生
1、READ UNCOMMITTED: 赃读、不可重复读、虚读都有可能发生。
2、READ COMMITTED: 避免赃读。不可重复读、虚读都有可能发生。(oracle默认的)
4、REPEATABLE READ:避免赃读、不可重复读。虚读有可能发生。(mysql默认的)
8、SERIALIZABLE: 避免赃读、不可重复读、虚读。
注:1.级别越高,性能越低,数据越安全
2. 1 2 4 8是指其在jdbc中对应的值
6.查看与更改事务的级别
1)查看:select @@tx_isolation
2)修改:set transaction isolation level + 隔离级别
*****必须在事务开启之前设置隔离级别