Hibernate的数据库事务管理

本文详细介绍了数据库事务的概念及其四大特性:原子性、一致性、隔离性和持久性。探讨了事务的边界控制方法,包括JDBC和Hibernate API的具体应用。此外,还讨论了多事务并发可能引发的问题及解决方案,并对比了悲观锁和乐观锁的不同之处。

一、           数据库事务概念

数据库事务的特征: ACID

Atomic (原子性)、 Consistency (一致性)、 Isolation (隔离性)和 Durability (持久性)。 DBMS 用日志来保证数据的原子性、一致性和持久性;用锁的机制来保证数据的隔离性。

二、           事务的边界

数据库支持 2 种事务模式:自动提交和手动提交。

JDBC API 的事务边界

try
{
    Connection conn 
=  java.sql.DriverManager,.getConnection(dbUrl,dbUser,dbPwd);
    conn.setAutoCommit(
false );  // 设置成手动模式
    stmt  =  conn.createStatement();
    stmt.executeUpdate(
" . " );  // 数据库更新1
    stmt.executeUpdate( " . " );  // 数据库更新2
    
    conn.commit();
}

catch (Exception e)
{
    conn.rollback();
}

finally
{
    stmt.close();
    conn.close();
}

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> 可以管理并发。乐观琐比悲观琐有更好的并发性,优先考虑乐观琐。  

http://www.blogjava.net/sodmewuhan/archive/2006/04/22/42505.html
145533.html

KE 2007-09-16 14:50 发表评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值