事务
其实Hibernate中的事物的原型还是数据库基本类似。没有什么比较特别的地方,至少我第一次学习觉得没有什么特别的地方。
Hibernate中的几个异常及常用处理办法
HibernateException,是个一般的错误。
必须通过检查异常信息,或者通过getCause方法找出更多原因。
JdbcException
是被Hibernate的内部JDBC层抛出的任何异常,这种异常总是又一个特定的SQL语句产生,
可以用getSql()获得引起麻烦的语句。JDBC连接(实际上是JDBC驱动器)抛出的内部异常可以通过getSQLException()或者getCause()获得,并且通过getErrorCode()可以得到特定特定于数据库和特定于供应商的错误代码。
Hibernate包括JDBCException的子类型和一个内部转换器,改转换器视图吧数据库驱动抛出器的特定于供应商的错误代码变成一些更有意义的东西,内建的转换器可以给Hibernate支持的最重要的数据库方言生成JDBCConnectionException,SQLGrammarException,LockAquistionException,DataException和ConstraintViolationException。可以对数据库操作或者增强方言,或者
插入SQLExceptionConverterFactory定制这种变换。
其他RuntimeException.
四种数据更新的错误和隔离级别
第一种,丢失更新,其定义是两个事务更新同一行,然后第二个事务失败,那么第一个事务的更新就会失效。说句实话,我觉得很拗口,同时也很难理解。因为觉得,除非在极度特殊的情况下,真的很难出现这种情况。因为谁都知道,事务和事务之间,本能的会吧这些分开。
第二种,脏读取。不过觉得书中的解释可能不是很容易理解,书中说的是读取了另一个事务还没有提交的改变。其实我的理解就是读取了变化了之前的数据。
第三种,不可重复读。这个就是如果读两次,那么两次就有可能不一样。
最后一种,幻读。两次返回的不同的数据行。
就好像书中说的那样。丢失更新和脏读取可能要避免,但是后两种其实是相对来说不是那种必须克服的错误。
与其相对应的数据库隔离级别是
未提交读,提交读,可重复读和序列化读。这些都是概念性很强的东西,如果看得明白最好,看不明白建议反复的读。
修订隔离级别,
在Hibernate中,为hibernate.connection.isolation这个属性。
乐观锁及其并发控制
乐观锁是乐观的认为很少会发生并发控制等问题。所以其解决的也很简单,就是用一个版本控制来控制冲突。至于版本控制,可以通过加入<version>或者<timestamp>标签来实现。
悲观锁
首先想要写一下Hibernate中的锁模式
LockMode.None--别到数据库中去,除非对象不处于任何高速缓存中。
LockMode.Read--绕过所有高速缓存,并执行版本检查,来验证内存中的对象是否与当前数据库中存在的版本相同,相当于共享锁
LockMode.UpGrade--绕过所有高速缓存,做一个版本检查,如果支持的话,就获得数据库级别的悲观升级锁,如果数据库不支持select ....for update选项,退回到Lockmode.Read,其解决了不可重复读的问题。
LockMode.UPGRAGE_NOWAIT——与前面一个相同。就是多个不要等的功能,如果数据库不支持,那么久退回到前面一个。
LockMode.force--在数据库中强制增加对象的版本。实际上估计和乐观锁有关吧。
LockMode.WRITE--内部使用。
其实我的理解是这样的。尽管这些操作完成了锁的目的。但是在实际实现,还是和Hibernate的缓存有关。尽管借用了一些数据库中的操作,但是就是操作中涉及,持久化对象,缓存中的对象和数据库中对象的比较,具体的说,就是谁和谁比。然后根据这个比的结果,再处理锁和更新。