1、事务概述
事务指的是逻辑上的一组操作,组成这组操作的各个单元要么全部成功,要么全部失败。
事务的特性:
原子性:事务是不可分割的,多条语句要么都成功,要么都失败
一致性:事务的执行的前后,数据要保持一致(即一旦发生了回滚,数据必须回滚到事务执行前的数据状态)
隔离性:一个事务的执行不应该受到其他事务的干扰
持久性:事务一旦结束,数据就持久保持到了数据库
其中,如果直接不考虑事务的隔离性,会引发下面不同级别的问题:
脏读:一个事务读取到另外一个事务还没有提交的数据
不可重复读:一个事务读取到了另外一个事务已经提交的update数据,导致在当前事务中的多次查询结果不一致
虚读/幻读:一个事务读取到了另外一个事务已经提交的insert数据,导致在当前事务中的多次查询结果不一致
对应于上述这些问题,事务具有不同的隔离级别,且隔离级别可设置,不同级别描述如下:
* 1 read uncommitted :未提交读.脏读,不可重复读,虚读都可能发生.
* 2 read committed :已提交读.避免脏读.但是不可重复读和虚读有可能发生.(Oracle默认)
* 4 repeatable read :可重复读.避免脏读,不可重复读.但是虚读有可能发生.(MySql默认)
* 8 serializable :串行化的.避免脏读,不可重复读,虚读的发生.
隔离级别的设置 方法:
MySql:
查看当前事务隔离级别:SELECT @@TX_ISOLATION;
更改当前的事务隔离级别:SET TRANSACTION ISOLATION LEVEL 四个级别之一
Java代码:
在Java中,事务的操作通常通过Connection接口的实现类对象来完成,故事务的级别被定义为了Connection接口的常量,列表如下:
int TRANSACTION_READ_UNCOMMITTED = 1;
int TRANSACTION_READ_COMMITTED = 2;
int TRANSACTION_REPEATABLE_READ = 4;
int TRANSACTION_SERIALIZABLE = 8;
这四个级别分别与上述的事务隔离级别对应,可以通过Connection接口中提供的setTransactionIsolation(int level)方法来实现设置事务的隔离级别。
2、JDBC操作事务
在Java中,操作事务的方法被定义在Connection接口中,故操作事务需要通过Connection接口实现类的对象来进行操作,对于MySql数据库,Java执行一次完整事务的步骤描述如下(con为Connection对象):
a、将事务的自动提交设置为false,即开启事务con.setAutoCommit(false)
b、执行事务中的所有单元
c、如果执行结果达到了预期要求,那么通过con.commit();来提交当前事务
d、如果当前的执行结果未达到预期要求或者事务中单元的执行过程中出现了错误,那么通过con.rollback();来回滚事务。此时数据会回到事务开启前的数据状态