事物并发出现的问题
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 ) | 不可能 | 不可能 | 不可能 |
这个是不支持事务的情况下,会出现的问题。一般不需考虑