JDBC 五种事务隔离级别

为了解决与“多个线程请求相同数据”相关的问题,事务之间通常会用锁互相隔离开。大多数主流的数据库支持不同类型的锁。因此,JDBC

API 支持不同类型的事务,他们由Connection对象指派或确定(Connection的5个静态常量)。

① TRANSACTION_NONE  // 不支持事务

② TRANSACTION_READ_UNCOMMITTED  // 未提交读。说明在提交前一个事务可以看到另一个事务的变化。此事务级别下,允许“脏读”、不可重复读、“幻读”

③ TRANSACTION_READ_COMMITTED  // 已提交读。说明读取未提交的数据是不允许的。此事务级别下,不允许“脏读”,但允许不可重复读、“幻读”

④ TRANSACTION_REPEATEABLE_READ  // 可重复读。说明事务保证能够再次读取相同的数据而不会失败。此事务级别下,不允许“脏读”、不可重复读,但允许“幻读”

⑤ TRANSACTION_SERIALIZABLE  // 可序列化,这是最高的事务级别。不允许“脏读”、不可重复读、“幻读”

备注:数据库中读数据的一些概念

“脏读”:一个事务读取了另一个事务尚未提交的数据。就是当一个事务正在访问数据,并且对数据进行了修改,而这种修改还没有提交到数据库中,这时,另外一个事务也访问这个数据,然后使用了这个数据。因为这个数据是还没有提交到的数据,那么另外一个事务读到的这个数据是脏数据,依据脏数据所做的操作可能是不正确的。

不可重复读:一个事务的操作导致另一个事务在事务内两次读取到不同的数据,这是由于查询时系统中其他事务修改的提交引起的。比如事务T1读取某一数据,事务T2读取并修改了该数据,T1为了对读取值进行检验而再次读取该数据,便得到了不同的结果。即在一个事务内,多次读同一个数据,在这个事务还没有结束时,另一个事务也访问该同一数据。那么在第一个事务的两次读数据之间,由于第二个事务的修改,使得第一个事务读到的数据可能不一样,这样就发生了在一个事务内两次读到的数据是不一样的,因此成为不可重复读,即原始读取不可重复。

“幻读”:一个事务的操作导致另一个事务前后两次查询的结果数据量不同。指当事务不是独立执行时发生的一种现象,例如第一个事务对一个表中的数据进行了修改,这种修改涉及到表中的全部数据行;同时,第二个事务也修改这个表中的数据,这种修改是向表中插入一行新数据。那么,以后就会发生操作第一个事务的用户发现表中还没有修改的数据行,就如同发生的幻觉一样。

不可重复读和幻读的区别是:

不可重读读是指读到了已经提交的事务的更改数据(修改或者删除),即多次读一条记录,发现该记录中某些列值被修改过;防止不可重复读只需对操作的数据添加行级锁,防止操作中数据发生变化。

“幻读”是指读到了其他已经提交的事务的新增数据。即多次读一个范围内的记录,发现结果集不一致(记录增多或者减少);防止“幻读”,往往需要添加表级锁,将整张表锁定,防止新增记录。

猜你喜欢

转载自www.cnblogs.com/0820LL/p/9706396.html
今日推荐