数据隔离级别

1. 脏读 : 读了别人没有提交的数据

2. 不可重复读: 在同一个事务中前后读取的数据不一样,由于被人一脚提交造成。一般是更新。

            我们可以这样做,我们可以把读出的数据加锁,这样别人即使提交了,也不会影响到我得到的数据。

3. 幻想读: 在同一个事务中前后读取的数据个数不一样,由于 删除,插入造成。 一般用到的很少,比如,我查一次平均值不会再去查一次平均值。

 

1 read-uncommitted

2 read-committed

4 repeatable read

8 serializable 

 

mysql ,用 select @@tx_isolation,可以看到默认的是repeatable-read

 

而Oracle 的是 read-committed.

 

如果我们要处理金融 ,电信方面的软件,我可以在数据中设置,或者在hibernate 框架中设置。用hibernate 的悲观锁机制。

 

处理 repeatable read 的问题。

 

悲观锁和乐观锁,为了考虑并发的效率,我们设置 hibernate.connection.isolation=2

我们为了防止被人我们在修改的时候要修改,我们可以用悲观锁: repeatable read (依赖数据库中的隔离级别)

 

BigDecimal 是用来处理金融交易中的数据。

double ,float 的精度问题。

 

悲观:

  在财务上有这样一个题目:

  Account account = (Account)session.load(Account.class,1,LocakMode.upgrade);

 

这样在查询的时候就不会有人更新它,在未提交前。

 

乐观:对Feild 的设置,在hibernate 中用version,对某一个字段进行前后的值的对比,如果改变 该值被修改了。在恢复到以前的值。

 

    实现:@version ,版本。svn一样的原理。

 

   在事务未提交前,值改变了,他会报错。也可以称为回滚。

 

1+N解决问题:  Lazy

                       join fetch

                       BatchSize

Iterate, 先取ID,在根据id到去查找对象。m:1 不要使用。 

List,一次取出。

 

session中,list第二次,仍然要去到数据库。

 

iiterate ,第二次,要到session缓存中。

 

 

 

 

 

 

你可能感兴趣的:(oracle,Hibernate,数据库,list,session,金融)