Hibernate API
声明事务边界
Session session
=
factory.openSession();
Transaction tx;
try
{
tx
=
session.beginTransaction();
//
开始事务
//
执行操作
。。。。。
tx.commit();
}
catch
(Exception e)
{
if
(tx
!=
null
)
{
tx.rollback();
}
}
finally
{
session.close();
}
注:一个
session
可以对应多个事务,但是推荐的做法是一个
session
对应一个事务。
三、
多事务的并发问题
当多个事务同时访问相同的数据的时候,程序如果没有采取适当的隔离措施,就会发生数据库的并发问题。常见的并发问题有:
第一类丢失更新:撤消事务的时候,把其他的事务已经提交的数据给覆盖了;
脏读;读了没有提交的数据;
虚读:一个事务读到另外一个事务已经提交的新插入的数据;
不可重复读:一个事务读到另外一个事务已经提交的更新的数据;
第二类丢失更新:一个事务覆盖另外一个事务已经提交的更新数据。
四、 锁
一般地,大型的
DBMS
都会自动的管理锁定机制,但是在对数据的安全性、完整性和一致性有特殊要求的地方,可以由事务本身来管理琐的机制。
有一点要关注的是:锁的粒度越大,隔离性越好,并发性越差。
按照锁的程度来分有:
共享锁:用读操作,非独占的,其他事务可以读,但是不能更新,并发性好;
独占锁:用与
insert update
和
delete
等语句,其他事务不能读,也不能改,并发性差;
更新锁:执行
update
的时候,加锁。
死琐:多是事务分别锁定了一个资源,又请求锁定对方已经锁定的资源,就造成了请求环。
降低死锁的最好办法是使用短事务。
五、
数据库的事务隔离级别
数据库提供
4
种事务隔离级别:
Serializable
:串行化;(隔离级别最高)
1
Repeatable Read
:可重复读;
2
Read Commited
:读已提交数据;
4
Read Uncommited
:读未提交数据;(隔离级别最低)
8
Hiberate
中的隔离级别的设置
在
Hibernate
的配置文件中
hibernate.connection.isolation=2
六、
悲观锁和乐观琐
从应用程序的角度来看,锁分为悲观锁和乐观锁。
悲观锁:显示的为程序加锁,但是降低并发性。
Select ……. For update;
在
Hibernate
中的代码
Session.get(Account.class,net Long(1),LockMode.UPGRADE)
;
//
程序采用悲观锁
乐观锁:依靠
DBMS
来管理锁,程序依靠版本控制来避免并发问题。
在对象
-
关系映射的文件中,用
<version>
或者
<timestamp>
可以管理并发。乐观琐比悲观琐有更好的并发性,优先考虑乐观琐。