数据库事务

JDBC规范中定义了四个数据库事务级别:
TRANSACTION_NONE   【无事务】

TRANSACTION_READ_UNCOMMITTED  【读取未提交】

TRANSACTION_READ_COMMITTED  【读取已提交】

TRANSACTION_REPEATABLE_READ  【可重复读】

TRANSACTION_SERIALIZABLE  【串行化】

 

如上的中文命名是我自己取的,是字面翻译。

各级别的事务影响到的效果分别有几个:

幻读 ,不可重复读, 脏读

它们真的事务严格级别的排序就是:
幻读 <  不可重复读  <  脏读

 

幻读:表示在事务1执行中,分别根据相同条件查询2次,两次中间,事务2插入了一条记录,并且提交了事务。事务1在第二次读取时,可以看到刚才事务2插入的数据。但是事务2修改的数据是无法读取(实际中应该是事务2并无法在事务1执行中,更新事务1锁定的记录。这个锁应该是行级别的锁,但是并没锁定表,所以插入数据是可以的,这是个人理解,如有大侠发现不对,请帮我更正)

 

不可重复读:意思就是在一个事务中,先后读取2此数据,数据内容不一样(说的是相同记录中字段值变化了,不包含出现了新的记录行),发送这个的原理就是,事务1中,先读取第一次,之后事务2更新了事务1中查询出的某些记录的字段值,并且是事务2提交了事务。然后事务1又重新读取刚才相同查询条件的记录,发现和之前查询中相同记录中字段值有些已经不一样了。

 

脏读:表示事务1修改了数据(修改字段或者插入记录),还没提交事务时,事务2就执行了,而且可以看到并使用事务1做了修改的记录,而此时事务1还并没有提交呢。表示事务2发生了脏读,事务2使用了还没提交的数据,这些数据就叫脏数据。所以叫脏读。这是危险的,因为事务1可能之后选择回滚事务。那么再某些业务上将产生严重的错误。

 

JDBC事务级别从不严格到严格,产生的不良效果从重到轻,效率也从快到慢:

TRANSACTION_NONE   【无事务】  

什么不良效果都可能发生

 

TRANSACTION_READ_UNCOMMITTED  【读取未提交】

可产生:脏读、不可重复读、幻读

字面意思理解:我可以读取别人未提交的内容。

 

TRANSACTION_READ_COMMITTED  【读取已提交】

可产生:不可重复读、幻读

字面理解:在我的事务过程中,可以读取别人已经提交的数据

 

TRANSACTION_REPEATABLE_READ  【可重复读】

可产生:幻读

字面理解:可以重复读,意思是,杜绝了不可重复读(含)以上,但会产生幻读。

 

 

TRANSACTION_SERIALIZABLE  【串行化】

以上不良效果都不会产生,因为事务是串行化的,就是一个一个的事务挨个执行。应该是锁定了整个表。

你可能感兴趣的:(数据库事务)