Hibernate 事务

    事务概念:指一个单元的工作,要么全做,要么不做。同时,是一个可恢复单元的工作,由一条或者多条Transact-SQL语句组成,可影响到一行或者多行数据。事务打开后,直到事务成功完成提交为止,或者事务失败全部取消或者回滚为止。

     显式事务:显定义事务开始或者结束的事务。

                        begin transaction \commit transaction \ commit work \rollback transaction \rollback work                         Transact-SQL

                        显事务模式时间只限于事务持续期。结束即结束。

     隐事务:启动事务的语句

语句语句语句语句
alter table dropinsertselect
createfetchopentruncate table
deletegrantrevokeupdate

                        隐士事务可以用Transact-SQL set语句来设置。隐式事务会在有大量数据定义语言(DDL)和数据操作  语言(DML)命令执行自动开始,并一直保持到用户明确提交为止,可以用 set implicit_transactions 为连接设置隐式设置模式,当设置为ON时,set implicit_transactions 为隐式,OFF时,则是连接返回到自动提交事务模式。



10.1.2ACID

            1.Automicity(原子性):要么全部执行,要么全不执行。

            2.Consistency(一致性):事务完成时,所有数据保持一致。

            3.Isolation(隔离性):并发事务所做的修改必须与任何其他事务修改所隔离。

            4.Durability(持久性) :事务完成后,对于系统影响具有永久性。

10.1.3 Hibernate中使用事务

            

            JDBC本身设计时不具备事务处理功能,Hibernate对jdbc进行轻量级封装。Hibernate将底层JDBCTransaction或JTATransaction进行了封装,再在外面上套上Transaction和Session的外壳,其实是通过底层的JDBC或JTA实现事务处理的功能:

            配置事务:在Hibernate.properties进行平配置(默认jdbc事务):

            # hibernate.transaction.factory_class  org.hibernate.transaction.JTATransactionFactory

             # hibernate.transaction.factory_class  org.hibernate.transaction.JDBCTransactionFactory

        1.在Hibernate中使用事务的步骤:

  	Session session = getSession();
		Transaction  t = null;
		try {
			t = session.beginTransaction();
			t.commit();
			t==null;
		} catch (Exception e) {
			try {
				if(t!=null){
					t.rollback();
				}
			} catch (HibernateException e2) {
				// 处理异常
			}
		}finally{
			try {
				session.close();
			} catch (HibernateException e) {
				// 处理异常
			}
		}


            2.在Hibernate中使用JDBC事务



public static void saveObject(Object obj){
	
		Transaction  t = null;
		try {
		        Session session = getSession();
			t = session.beginTransaction();
			//保存事件
			session.save(obj);
			
			t.commit();
			t==null;
		} catch (Exception e) {
			try {
				if(t!=null){
					t.rollback();
				}
			} catch (HibernateException e2) {
				// 处理异常
			}
		}finally{
			try {
				session.close();
			} catch (HibernateException e) {
				// 处理异常
			}
		}
		
		}

            3.在Hibernate中使用JTA事务

            JTA(java Transaction API)是事务服务的J2EE解决方案:

               配置打开即可使用:


                  hibernate.transaction.factory_class  org.hibernate.transaction.JTATransactionFactory

             # hibernate.transaction.factory_class  org.hibernate.transaction.JDBCTransactionFactory


            去掉‘#’号,或者在hibernate.cfg.xml中如下配置

                

        <session-factory>  
                <property name="hibernate.transaction.factory_class">
                    org.hibernate.transaction.JTATransactionFactory
                </property>
        </session-factory>

 10.2 并发控制

            4个并发问题:1》丢失更新:两个或多个事务选择同一行数据,基于最初选定值,会发生丢失更新问题。

                                  2》脏读:第二个事务选择其他受正在更新时,发生未确认相关性的问题。

                                   3》非重复读:当第二个事务多次访问同一行而每次读取不同数据时,发生不一致问题。

                                   4》幻想读:当对某行执行插入或删除操作,而该行属于某个事务的读取范围,发生幻想。

                                    5》并发问题解决方案:

                                            SQL Server中共享锁,排它锁,更新锁,意向锁。

        

转载于:https://my.oschina.net/gxs2012/blog/221791

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值