一、事务
1. 事务介绍
事务可以包含多个操作步骤 , 如果有一个步骤失败,那么这一组都以失败告终。
事务是指包含多个微小逻辑单元的一组操作, 只要其中有一个逻辑失败了,那么这一组操作就全部以失败告终,不存在一半成功,一半不成功的状况。
事务在平常的CRUD当中也许不太常用, 但是如果我们有一种需求,要求,一组操作中,必须全部成功执行,才算完成任务,只要有一个出错了,那么所有的任务都将回到最初的状况,恢复原样。那么这就可以使用事务了。如: 银行的转账例子 , 又如一次性往两张表添加记录,需要确保这两张表都能全部成功添加,不允许一张表成功,一张表失败这种情况出现。
2. 事务入门
1. 命令行演示
方式一
-- 开启事务
start transaction;
-- 执行操作
update student set age = 28 where id = 6;
-- 提交事务,只有提交事务,数据才会真的保存到底层设备上。
commit;
-- 如果不想提交,想回到最初的状态,那么可以回滚事务.
rollback;
方式二
mysql 的事务设置是自动提交,我们可以关闭掉自动提交开关,然后手动提交事务。
-- 显示有关提交的变量信息
show variables like '%commit%';
-- 关闭自动提交
set autocommit = off ; 或者写成 set autocommit = 0 ;
-- 执行操作,可以不用开启事务
update student set age = 28 where id = 6;
-- 必须提交,才能看到结果
commit;
2. 代码演示
@Test
public void testTransaction(){
Connection conn = null;
try {
ComboPooledDataSource dataSource = new ComboPooledDataSource();
conn = dataSource.getConnection();
//开启事务 关闭自动提交,
conn.setAutoCommit(false);
//3. 执行语句
String sql = "insert into student values(null ,?,?)";
PreparedStatement ps = conn.prepareStatement(sql);
ps.setString(1,"lisi2");
ps.setInt(2,19);
ps.executeUpdate();
//提交事务
conn.commit();
//释放资源..回收连接对象
ps.close();
conn.close();
} catch (Exception e) {
e.printStackTrace();
//如果出现了异常,那么回滚事务
try {
conn.rollback();
} catch (SQLException e1) {
e1.printStackTrace();
}
}
}
3. 事务特性 ACID
原子性
原子性(Atomicity) : 事务中的逻辑要全部执行,不可分割。(原子是物理中最小单位)
一致性
一致性(Consistency):事务执行的结果必须是使数据库数据从一个一致性状态变到另外一种一致性状态
隔离性(isolation)
一个事务的执行过程中不能影响到其他事务的执行,即一个事务内部的操作及使用的数据对其他事务是隔离的,并发执行各个事务之间无不干扰。
持久性()
即一个事务一旦提交,它对数据库数据的改变是永久性的。之后的其它操作不应该对其执行结果有任何影响。
4. 事务隔离级别
主要是用来解决事务并发执行,引发的问题。
如果两个事务同时,或者交错执行,那么他们的执行结果可能会受对方影响,这会导致数据的前后显示不一致。所以为了保证并