Hibernate与数据库事务
2016-06-10 13:23
281 查看
Hibernate异常
持久化上下文提供了可重复读的保证(多次读取同一条记录,该记录不变),如果不需要防止幻读,可以使用RC隔离级别.(Mysql RR无幻读).
使用@Version启用乐观版本控制,即first commit success.其他提交将抛出OptimisticLockException.
InnoDB隔离级别与存在的问题
* 由于RC快照读出现的不可重复读问题可以由HIbernate一级缓存解决,所以如果不需要解决幻读问题,可以使用RC隔离级别。
* RC当前读与RR当前读的最大区别,就是RR当前读使用了GAP锁(解决了幻读问题),这二者都使用了X锁。所以都没有不可重复读的问题(对一条数据加了行锁)。
* RC当前读可能出现查询条件相同,但是两次返回结果不同的情况,RR当前读由于加了GAP锁,所以不存在这种通过insert/update改变某条数据使得符合条件的数据变更的情况存在。即,如果需要在一个事务中对一个范围查询返回一致的查询结果,那么应该使用RR,对一条唯一数据返回一致结果则使用RC当前读即可。
* 基于当前读(for update)的结果进行数据更新,则RR/RC都不存在丢失更新的问题,这相当于使用了悲观锁,但基于快照读的结果进行数据更新,则RR/RC都存在第二类丢失更新的问题,所以基于快照读更新数据需要额外的乐观锁保障(Hibernate的@Version)。(在某些情况下,悲观锁根本不能被应用到实际项目中,比如web的请求无状态性质,导致其查询与更新的操作不可能在一个事务内完成,这时候的更新丢失问题就只能通过乐观锁解决了)。
hibernate与JTA
UserTransaction#beginTransaction必须先于EntityManagerFactory#getEntityManager执行,否则hibernate无法利用JTA事务进行回调刷新.
UserTransaction#setTransactionTimeout设置事务超时时间.
1.Hibernate5/JPA抛出的异常都是RuntimeException异常. 2.如果一个持久化上下文运行在一个JTA事务下,那么抛出的大部分JPA 异常(严重异常)会自动将当前事务状态设置为Rollback。除了几个异 常,分别是 (NoResultException;NonUniqueResultException;QueryTime outException;LockTimeoutException),这些异常不会将事务状态 设为Rollback,但你还是可以捕获这些异常,并决定是手动回滚还是尝试 异常恢复.
持久化上下文提供了可重复读的保证(多次读取同一条记录,该记录不变),如果不需要防止幻读,可以使用RC隔离级别.(Mysql RR无幻读).
使用@Version启用乐观版本控制,即first commit success.其他提交将抛出OptimisticLockException.
@Version protected long version;
InnoDB隔离级别与存在的问题
问题 | RC快照读 | RC当前读 | RR快照读 | RR当前读 |
---|---|---|---|---|
不可重复读 | ✔ | ✘ | ✘ | ✘ |
幻读 | ✔ | ✔ | ✘ | ✘ |
* RC当前读与RR当前读的最大区别,就是RR当前读使用了GAP锁(解决了幻读问题),这二者都使用了X锁。所以都没有不可重复读的问题(对一条数据加了行锁)。
* RC当前读可能出现查询条件相同,但是两次返回结果不同的情况,RR当前读由于加了GAP锁,所以不存在这种通过insert/update改变某条数据使得符合条件的数据变更的情况存在。即,如果需要在一个事务中对一个范围查询返回一致的查询结果,那么应该使用RR,对一条唯一数据返回一致结果则使用RC当前读即可。
* 基于当前读(for update)的结果进行数据更新,则RR/RC都不存在丢失更新的问题,这相当于使用了悲观锁,但基于快照读的结果进行数据更新,则RR/RC都存在第二类丢失更新的问题,所以基于快照读更新数据需要额外的乐观锁保障(Hibernate的@Version)。(在某些情况下,悲观锁根本不能被应用到实际项目中,比如web的请求无状态性质,导致其查询与更新的操作不可能在一个事务内完成,这时候的更新丢失问题就只能通过乐观锁解决了)。
hibernate与JTA
UserTransaction#beginTransaction必须先于EntityManagerFactory#getEntityManager执行,否则hibernate无法利用JTA事务进行回调刷新.
UserTransaction#setTransactionTimeout设置事务超时时间.
相关文章推荐
- Android之获取手机上的图片和视频缩略图thumbnails
- 数据库链接字符串查询网站
- DB2实例管理
- DB2实例管理
- 保障MySQL数据安全的14个最佳方法
- mysql问答汇集
- 第三章 数据库备份和还原
- 创建一个空的IBM DB2 ECO数据库的方法
- Access 2000 数据库 80 万记录通用快速分页类
- 开通一个数据库失败的原因的和解决办法
- 一个简单的asp数据库操作类
- CentOS下DB2数据库安装过程详解
- EasyASP v1.5发布(包含数据库操作类,原clsDbCtrl.asp)第1/2页
- sql2008 还原数据库解决方案
- Oracle 数据库自动存储管理-安装配置
- Oracle数据库执行脚本常用命令小结
- Oracle 数据库 临时数据的处理方法
- 数据库分页查询语句数据库查询
- 最近比较流行的数据库挂马