JDBC事务处理相关

什么是事务?

事务是指构成单个逻辑工作单元的操作集合。当在一个事务中执行多个操作时,要么所有操作都被提交(commit),要么整个事务回滚(rollback)到最初状态。

当一个连接对象被创建时,默认情况下是设置为自动提交事务。可以调用Connection对象的setAutoCommit(false)方法,然后在所有SQL语句成功执行之后,在调用对象的commit()方法来提交事务,或者在执行出错时,调用Connection对象的rollback()方法来回滚事务。

事务的隔离级别

关于脏读,不可重复读,幻读
脏读

一个事务正在访问数据,并对数据进行了修改,而这种修改还没有提交到数据库中,于此同时,另外一个事务读取了这些数据,因为这些数据还没有提交,所以另一个事务读取的数据是脏数据。如果前一个事务发生回滚,后一个事务是无效的数据。

        Connection connection=getConnec();
        connection.setAutoCommit(false);
        insert(connection);
        query(connection);

insert事务还没有提交,但是query可以读到insert更改后的数据,这时候要是insert回滚了,那么query读到的数据就是无效的

不可重复读

(针对其他提交前后,读取数据本身的对比)一个事务读取了一行数据,在这个事务结束前,另一个事务访问了同一行数据,并对数据进行了修改,这时候要是第一个事务再次读取这行数据,就会得到不一样的数据。

幻读

(针对其他提交前后,读取数据条数的对比)一个事务读取了满足条件的所有行后,第二个事务插入了一行数据,当第一个事务再次读取同样条件的数据时,发现多出了一行数据。

四种事务隔离

Read Uncommitted

最低等级的事务隔离,三种情况都有可能发生

Read Committed

保证了一个事务不会读到另一个并行事务已修改但未提交的数据。避免了脏读(这里注意:执行了改变数据的SQL语句,数据就会修改,但是未提交的话数据库不会修改)**该事务提交之后,另一个事务才可能读取到同一笔数

Repeatable Read

一个事务在执行过程中可以看到其他事务已经提交的新插入的数据,但是不能看到其他事务对已有记录的更新。避免了脏读和不可重复读保证在整个事务的过程中对同一笔数据的读取结果是相同的

Serializable

当两个事务同时访问相同数据时,如果第一个事务已经在访问该数据,那么第2个事务只能停下来等待。是最高级的事务隔离,三种情况都被避免

对应的jdbc设置

Connection接口中的setTransactionIsolation()方法用于设置事务的隔离级别。定义了五个常量,对应隔离级别

TRANSACTION_NONE 不支持事务

TRANSACTION_READ_UNCOMMITTED

TRANSACTION_READ_COMMITTED 避免了脏读

TRANSACTION_REPEATABLE_READ 避免了脏读和不可重复读

TRANSACTION_SERIALIZABLE 避免了脏读,不可重复读,幻读