事务的概念:事务值一个单元的工作,这些工作要么都完成,要么都不完成
事务的ACID特性:原子性,一致性,隔离性,持久性
简单理解为:
1.要么都完成,要么都不完成
2.所有数据具有一致状态
3.一个事务不能看着另外一个事务正在修改数据
4.写到数据库
hibernate将底层的JDBCTransaction和JTATransaction进行了封装,再在外面套上Transaction和Session外壳,其实都是委托底层的JDBC或JTA
默认使用的是JDBC
Transaction tran = session.beginTransaction();
...
tran.commit(); / tran.rollback();
JTA
场合:
1.一个查询调用几个数据库,需要一个分布式事务
2.跨session的长事务
使用:
1.hibernate.properties文件中
hibernate.transaction.factory_class org.hibernate.transaction.JTATransactionFactory
或hibernate.cfg.xml文件中
<session-factory>
<property name="hibernate.transaction.factory_class">
org.hibernate.transaction.JTATransactionFactory
</property>
</session-factory>
2.
应用接口:UserTransaction,TransactionManager,Transaction
javax.transaction.UserTransaction tx = null; tx = new initialContext().lookup(” javax.transaction.UserTransaction ”) ; tx.begin(); Session s1 = sf.openSession(); …… s1.flush();s1.close(); Session s2 = sf.openSession(); …… s2.flush(); s2.close(); tx.commit();
谈到事务必不可少的就是并发控制!!!
4个并发问题:
1.丢失更新(一起读,各自改)
A,B都正在读一份文档,但A修改了文档,B也想修改文档,那么A修改的将丢失,
所以B想修改必须重新载入
2.脏读(一读,一改)
一个事务选择了另外一个事务正在更新的行时,
所以修改数据前,保证任何人不能读取更改的数据
3.非重复读(读读)
作者完全完成编辑后,编辑人员才可以读取文档
4.幻读(一改,一读)
当对某行inert delete时,该行属于某个事务正在读取的行
缓解并发问题:
一:hibernate隔离级别
<session-factory>
<property name="hibernate.connection.isolaction"> 1 </property>
</session-factory>
防止
1 丢失跟新
2 脏读+丢失跟新
3 不可重复读+2
4 1+2+3
二:设置几个小锁
LockMode.NONE 默认 会检查缓存
LockMode.READ 直接select数据库,会检查版本
LockMode.UPGRADE 同上,但是数据库支持悲观锁就用select for update
LockMode.UPGRADE_NOWAIT 同上,但是数据库支持悲观锁就用select for update nowait
LockMode.WRITE 自动使用
LockMode.FORCE 对使用了version的记录强制增加version值
使用:
行:session.load(..)
对象:session.load(); session.lock(对象,锁)
query:session.createQuery().setLockMode().list();