事务&Hibernate中指定隔离级别
来源:互联网 发布:大数据市场调研 编辑:程序博客网 时间:2024/06/06 09:36
事务
l 事务:一组业务操作,要么全部成功,要么全部不成功。
在Hibernate中设置自动提交事务:
<!-- hibernate.connection.autocommit: 事务自动提交 (真正开发时,不用)<property name="hibernate.connection.autocommit">true</property>-->
l 特性:ACID
原子性:整体
一致性:数据
隔离性:并发
持久性:结果
l 隔离问题:
脏读:一个事务读到另一个事务未提交的内容
不可重复读:一个事务读到另一个事务已提交的内容(insert)
虚读(幻读):一个事务读到另一个事务已提交的内容(update)
l 隔离级别--解决问题
readuncommittd,读未提交。存在3个问题。
readcommitted,读已提交。解决:脏读。存在2个问题。
repeatableread ,可重复读。解决:脏读、不可重复读。存在1个问题。
serializable,串行化。单事务。没有问题。
hibernate设置隔离级别
l 在hibernate.cfg.xml 配置
hibernate.connection.isolation4
<!-- 改变Hibernate连接数据库的事务隔离级别1: 读未提交2: 读已提交4: 可重复读8: 串行化 --><property name="hibernate.connection.isolation">4</property>
lost update 丢失更新
l 悲观锁:(数据库提供实现) . 默认认为一定会发送别人要修改我使用的数据. 那我就可以为我读取的数据加锁.
丢失更新肯定会发生。
采用数据库锁机制。
读锁:共享锁。读锁可被其他线程所共享,如果是读取的话大家都可以用这把锁读到数据.
select.... from ... lock in share mode; select * from table lock in share mode(读锁、共享锁)
写锁:排他锁。(独占)写锁不能共享,只要有人为数据加入了写锁,其他人就不能为数据加任何锁.
select... from .... for update select * from table for update (写锁、排它锁)
l 乐观锁:丢失更新肯定不会发生
在表中提供一个字段(版本字段),用于标识记录。如果版本不一致,不允许操作。
hibernate处理丢失更新
l 悲观锁:写锁
package com.itheima.e_api;import java.util.List;import org.hibernate.Criteria;import org.hibernate.LockOptions;import org.hibernate.Query;import org.hibernate.Session;import org.hibernate.criterion.DetachedCriteria;import org.hibernate.criterion.Restrictions;import org.junit.Test;import com.itheima.domain.Customer;import com.itheima.utils.HibernateUtils;public class Demo2 {@Test//悲观锁//写锁public void fun1(){Session session = HibernateUtils.openSession();session.beginTransaction();//------------------------------------------------Customer c = (Customer) session.get(Customer.class, 1, LockOptions.UPGRADE);System.out.println(c);//------------------------------------------------session.getTransaction().commit();session.close(); // 游离状态}@Test//悲观锁//读锁public void fun2(){Session session = HibernateUtils.openSession();session.beginTransaction();//------------------------------------------------Customer c = (Customer) session.get(Customer.class, 1, LockOptions.READ);System.out.println(c);//------------------------------------------------session.getTransaction().commit();session.close(); // 游离状态}}
@Testpublic void demo01(){//1 查询所有Session session = factory.openSession();session.beginTransaction();Customer customer = (Customer) session.get(Customer.class, 1 ,LockMode.UPGRADE);System.out.println(customer);session.getTransaction().commit();session.close();}
l 乐观锁:
在PO对象(javabean)提供字段,表示版本字段。一般Integer
在*.hbm.xml 文件配置 <version name="...">
步骤一:在实体中加一个属性(提供get和set)步骤二:在hbm.xml中设置
<!-- 告诉Hibernate , 乐观锁的版本号的属性名 --><version name="version"></version>
步骤三:测试
@Testpublic void demo02(){//1 查询所有Session session = factory.openSession();session.beginTransaction();//Order order = new Order();//order.setPrice(998d);//session.save(order);Order order = (Order) session.get(Order.class, 32);order.setPrice(889d);session.getTransaction().commit();session.close();}
case:
package com.itheima.e_api;import java.util.List;import org.hibernate.Criteria;import org.hibernate.LockOptions;import org.hibernate.Query;import org.hibernate.Session;import org.hibernate.criterion.DetachedCriteria;import org.hibernate.criterion.Restrictions;import org.junit.Test;import com.itheima.domain.Customer;import com.itheima.utils.HibernateUtils;public class Demo3 {@Test//乐观锁public void fun1(){Session session = HibernateUtils.openSession();session.beginTransaction();//------------------------------------------------Customer c = (Customer) session.get(Customer.class, 1);c.setName("tom");System.out.println(c);//------------------------------------------------session.getTransaction().commit();session.close(); // 游离状态}@Test//悲观锁//读锁public void fun2(){Session session = HibernateUtils.openSession();session.beginTransaction();//------------------------------------------------Customer c = (Customer) session.get(Customer.class, 1, LockOptions.READ);System.out.println(c);//------------------------------------------------session.getTransaction().commit();session.close(); // 游离状态}}
- 事务&Hibernate中指定隔离级别
- Hibernate事务隔离级别
- Hibernate 事务隔离级别
- Hibernate中事务隔离级别
- hibernate 事务和隔离级别
- 细谈Hibernate数据库事务与隔离级别
- Hibernate Mysql事务与隔离级别
- Hibernate事务隔离级别及基本介绍
- Hibernate设置事务的隔离级别
- Hibernate事务隔离级别和事务传播特性
- Hibernate事务隔离级别和事务传播特性
- SSH:Hibernate框架(Hibernate数据库事务与隔离级别)
- 事务级别 锁 隔离级别
- 事务隔离级别
- SQL事务隔离级别
- 关于事务隔离级别
- 关于事务隔离级别
- 事务隔离级别
- First Angular2 App with TypeScript and Visual Studio 2013
- Qt v5.8.0 已发布
- Do Hard Things---做困难的事情
- windows10+ubuntu+GPT+UEFI 双系统
- vs2008-工具-属性页-环境变量
- 事务&Hibernate中指定隔离级别
- OpenStack Mitaka 版本不可不知的53个新特性
- Android框架基础之策略设计模式
- 利用软件仿真完整的通信系统
- 什么是多任务?什么叫做进程?什么是线程?
- 18 消息队列3
- 带你一步一步揭开Rxjava2.0的神秘面纱(2)
- 如何获取input type=file的路径
- javaWeb技术开发基础(1)