首页编程begintransaction?transaction.begin()和commit()都做了什么

begintransaction?transaction.begin()和commit()都做了什么

编程之家2023-11-0397次浏览

各位老铁们,大家好,今天由我来为大家分享begintransaction,以及transaction.begin()和commit()都做了什么的相关问题知识,希望对大家有所帮助。如果可以帮助到大家,还望关注收藏下本站,您的支持是我们最大的动力,谢谢大家了哈,下面我们开始吧!

begintransaction?transaction.begin()和commit()都做了什么

transaction.begin()和commit()都做了什么

因为mybatis把事务抽象到了transactionmanager中,而事务默认开启,所以我们只需要使用sqlsession.commit()和rollback()方法,因为在sqlsession中,实际上调用的是transactionmanager来完成的具体的事务提交和回滚操作。

而你说hibernate的begintransaction,其实这个方法不是开启事务,因为hibernate默认事务也是开启的,但是hibernate有事务状态这个概念,begintransaction方法仅仅是把session关联的事务置为活动状态而已,并不是真正开启一个事务。

java中的TransactionManager类使用方法。

Spring配置中transactionAttributes的使用方法和作用

最近碰到这个问题,在使用spring提供的JpaTemplate进行查询时,如果数据量超过100条,查询效率就会明显降低。由于开始时使用JPA内部的双向关联,造成各实体内部关联过多,从而影响所有的操作,因此怀疑是因为JPA的关联关系所致。但是去掉关联关系后的效果不显著。

查找spring的相关配置,发现原来关于“transactionAttributes”有问题。原来的配置如下:

<bean id="baseTransactionProxy" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"

begintransaction?transaction.begin()和commit()都做了什么

lazy-init="true" abstract="true">

<property name="transactionManager">

<ref bean="transactionManager"/>

</property>

<property name="transactionAttributes">

<props>

begintransaction?transaction.begin()和commit()都做了什么

<prop key="sav*">PROPAGATION_REQUIRED</prop>

<prop key="update*">PROPAGATION_REQUIRED</prop>

<prop key="delete*">PROPAGATION_REQUIRED</prop>

<prop key="get*">PROPAGATION_REQUIRED,readOnly</prop>

<prop key="find*">PROPAGATION_REQUIRED,readOnly</prop>

</props>

</property>

</bean>

使用上述配置,在JPA打出的日志中显示每次查询时都要进行更新操作,查阅相关spring的资料后发现transactionAttributes的各种属性的意义,现把资料分享如下:

PROPAGATION_REQUIRED--支持当前事务,如果当前没有事务,就新建一个事务。这是最常见的选择。

PROPAGATION_SUPPORTS--支持当前事务,如果当前没有事务,就以非事务方式执行。

PROPAGATION_MANDATORY--支持当前事务,如果当前没有事务,就抛出异常。

PROPAGATION_REQUIRES_NEW--新建事务,如果当前存在事务,把当前事务挂起。

PROPAGATION_NOT_SUPPORTED--以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。

PROPAGATION_NEVER--以非事务方式执行,如果当前存在事务,则抛出异常。

PROPAGATION_NESTED--如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则进行与PROPAGATION_REQUIRED类似的操作。

当前所有的事务都使用“PROPAGATION_REQUIRED”属性值,并且控制事务的操作权限为只读,以保证查询时不会更新数据。根据上述定义“PROPAGATION_REQUIRED”属性会造成为所有的操作都创建事务,从而会出现JPA的日志中查询时也会进行更新操作的现象,也就造成了效率的低下。将所有查询的操作改成事务类型为“PROPAGATION_NEVER”(不使用事务),则查询效率立即提升,但是此时担心一个问题:比如在一个saveXXX()的方法中,如果方法内部使用更新、查询、再更新的操作流程,会不会造成调用查询时,由于上述配置造成的抛出异常。

另外,如果出现

〈prop key="myMethod"〉PROPAGATION_REQUIRED,readOnly,-Exception〈/prop〉

这样的配置,其中:

-Exception表示有Exception抛出时,事务回滚.-代表回滚+就代表提交

readonly就是read only,设置操作权限为只读,一般用于查询的方法,优化作用.

FragmentTransaction的replace方法里面具体执行的是什么操作

使用 FragmentTransaction的时候,它提供了这样两个方法,一个 add,一个 replace,对这两个方法的区别一直有点疑惑。我觉得使用 add的话,在按返回键应该是回退到上一个 Fragment,而使用 replace的话,那个别 replace的就已经不存在了,所以就不会回退了。但事实不是这样子的。add和 replace影响的只是界面,而控制回退的,是事务。

1、

publicabstractFragmentTransactionadd(intcontainerViewId,Fragmentfragment,Stringtag)

Add a fragment to the activity state. This fragment may optionally also have its view(if Fragment.onCreateView returns non-null) into a container view of the activity.

add是把一个fragment添加到一个容器 container里。

publicabstractFragmentTransactionreplace(intcontainerViewId,Fragmentfragment,Stringtag)

Replace an existing fragment that was added to a container. This is essentially the same as calling remove(Fragment) for all currently added fragments that were added with the same containerViewId and then add(int, Fragment, String) with the same arguments given here.

replace是先remove掉相同id的所有fragment,然后在add当前的这个fragment。

publicFragmentTransactionreplace(intcontainerViewId,Fragmentfragment,Stringtag){

if(containerViewId==0){

thrownewIllegalArgumentException("Mustusenon-zerocontainerViewId");

}

doAddOp(containerViewId,fragment,tag,OP_REPLACE);

returnthis;

}

2、add和 replace方法都是调用的 doAddOp方法。也就是把一个操作 Op添加到队列。

privatevoiddoAddOp(intcontainerViewId,Fragmentfragment,Stringtag,intopcmd){

fragment.mFragmentManager=mManager;

if(tag!=null){

if(fragment.mTag!=null&&!tag.equals(fragment.mTag)){

thrownewIllegalStateException("Can'tchangetagoffragment"

+fragment+":was"+fragment.mTag

+"now"+tag);

}

fragment.mTag=tag;

}

if(containerViewId!=0){

if(fragment.mFragmentId!=0&&fragment.mFragmentId!=containerViewId){

thrownewIllegalStateException("Can'tchangecontainerIDoffragment"

+fragment+":was"+fragment.mFragmentId

+"now"+containerViewId);

}

fragment.mContainerId=fragment.mFragmentId=containerViewId;

}

Opop=newOp();

op.cmd=opcmd;

op.fragment=fragment;

addOp(op);

}

DbTransaction类 是做什么用的

transaction是事务

你在中间操作数据库可能同时操作几次数据库,比如说3次操作。

第一次操作成功,第二次成功,第三次失败了

如果没有事务的情况是第一二次不管第三次是否成功,他们都已成功,数据库编程新值,

可是有时候你想这样,如果第三次失败了,那么其他两次也不成功,这样就保证了数据的可靠性。

这时就是事务发挥的时候了,transaction.Commit();就是上面都成功了才提交, transaction.Rollback();起的就是回退的作用

OK,本文到此结束,希望对大家有所帮助。

友情链?友情链接的作用有哪些arraylist排序,Java中的ArrayList怎么进行冒泡排序