现在的位置: 首页 > 综合 > 正文

事物并发出现的问题,以及悲观锁和乐观锁得问题

2018年02月04日 ⁄ 综合 ⁄ 共 899字 ⁄ 字号 评论关闭

事物并发出现的问题

a)        脏读(Dirty Read)、读到未提交的数据。

读了另外一个事务的没有提交的数据

b)        不可重复读(NonRepeatable Read)

在同一个事物里头,前后读了2次是不一样的。(可能存在读的过程中另一个事务修改了数据)

c)        幻读(Phantom Read)

在你读的过程中,另一个事务向里面插入了一个新数据,影响你读的结果。

插入和删除的操作(这里一般数据库的锁只管不许更新,删除和插入时可以的)

 

Java.sql.connection 里面有事务的隔离级别、hibernate也是一样的

a)      read-uncommitted : 能够读未提交的数据   3个都会出现

b)      read-committed: 你不能限制重复读

c)      repeateable read: 底层就是加锁的机制。

d)      Serializable: 不管多少个事务来,你给我一个一个的执行,还会有问题吗?肯定就没有了。

 

 

悲观锁、乐观锁机制

为了考虑并发的效率,我们把它设定为read committed,但是我需要解决的是不可重复读、在hibernate中有两种方式来解决

 

 

悲观锁

Accounta = (Account)session.load(Account.class, 1, LookMode. upgrade);//upgrade

Select* from …..for update

底层用到的是数据库锁得机制(只能我读完了后别的才能够更新)

 

乐观锁

Version的机制,它不加锁,用一个version字段。表的字段自己加,然后更新是hibernate更新的。

 

 

对应的表

隔离级别

脏读(Dirty Read)

不可重复读(NonRepeatable Read)

幻读(Phantom Read)

读未提交(Read uncommitted)

可能

可能

 可能

读已提交(Read committed)

不可能

可能

可能

可重复读(Repeatable read)

不可能

不可能

可能

可串行化(Serializable )

不可能

不可能

不可能

 

这个是不支持事务的情况下,会出现的问题。一般不需考虑

 

抱歉!评论已关闭.