开发者社区> 问答> 正文

谁能跟我讲一下spring的声明式事务会对hibernate做哪些操作?报错

<!-- 配置事务管理器 -->
<bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory"></property>
</bean>


<!-- 配置事务通知属性 -->
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<!-- 定义事务传播属性 -->
<tx:attributes>
<tx:method name="save*" propagation="REQUIRED" /> <!-- 支持当前事务,如果执行到save开头的任何方法时没有事务则开启一个事务 这是最常见的方式 -->
<tx:method name="update*" propagation="REQUIRED" />
<tx:method name="add*" propagation="REQUIRED" />
<tx:method name="delete*" propagation="REQUIRED" />
<tx:method name="find*" propagation="SUPPORTS" read-only="true" /> <!-- 支持当前事务,如果当前没有事务,就以非事务方式执行。只读 -->
<tx:method name="get*" propagation="SUPPORTS" read-only="true" />
<tx:method name="" />
</tx:attributes>
</tx:advice>


<!-- 配置事务切面 -->
<aop:config>
<aop:pointcut id="txMethod" expression="execution(
org.ym.demo.service.Service.(..))" />
<aop:advisor advice-ref="txAdvice" pointcut-ref="txMethod" />

</aop:config>


上面是声明式事物的配置

发现注释这段 hibernateTemplete.save会报错。

(Write operations are not allowed in read-only mode (FlushMode.MANUAL): Turn your Session into FlushMode.COMMIT/AUTO or remove 'readOnly' marker from transaction definition.)

不使用hibernateTemple自己直接使用session.save 一定要opensession, getcurrentsession也报错( Could not obtain transaction-synchronized Session for current thread)

我就是想弄清楚 这里面的关系我很混乱 ,事物会帮我们开启session?

展开
收起
爱吃鱼的程序员 2020-06-12 15:51:12 734 0
1 条回答
写回答
取消 提交回答
  • https://developer.aliyun.com/profile/5yerqm5bn5yqg?spm=a2c6h.12873639.0.0.6eae304abcjaIB


    没玩过这些,我直接说一下我们公司内部架构的用法把,主要给你讲一下事务


    什么叫做事务,不知道你用的是啥数据库,事务就是当前链接下的数据要保持一致性,也就是你上面的所谓的session,我只用Oracle数据库,如果你用过pl/sql的话你每打开一个COMMANDWINDOW他就是一个事务,当前的COMMANDWINDOW做一个数据的增,删,改,如果不提交的话,那么另外一个COMMANDWINDOW里是看不出数据的变化了的,如果需要在另外一个里面看得到数据变化,那么你需要提交事务,使用commit语句,关闭COMMANDWINDOW也就是释放事务

    上面的一段配合的只是这么几句代码,我以最简单的JDBC为例

    conn=DriverManager.getConnection("jdbc:mysql:///day11","root","root");//获取链接conn.setAutoCommit(false);//开启事务conn.commit();//事务提交conn.rollback();//事务回滚conn.close();//这里是关闭连接



    你这里的疑问,我没玩过hibernet,但是大同小异,我以我 公司的内部框架的代码逻辑为例:

    如果我是新开启一个事务,也就是你说的 opensession,那么就是新开启一个事务,如果我选择的是获取当前的事务,就是你这边的 getcurrentsession,那么我会做一下判断,当前的线程是否存在事务,如果不存在,我就会新建一个事务,而从你的这个报错看的很清楚,hibernate的获取当前事务的时候,如果不存在当前事务,那么他就直接报错了!





    ------菜鸟见解,欢迎拍砖,PS:JDBC的事务控制,回答这个问题的时候我才去百度,以前就一直是记JDBC五步操作,到公司直接用内部框架了,就没去认真研究!

    不要狭义的理解session就是你想的那个session哈

    getcurrentsession当前线程的session为了让pojo从数据库到页面到结束使用出于同一session便于hibernate代理,并添加各种操作,事务等保证状态一致,

    opensession开启一个新session,没有上述特点

    spring其实在后面代理了你的hibernate动作,模板保证每个写操作[你配置的情况下]都有事务控制,保证数据一致性[出现异常,事务回滚]



    首先明确一点,关系数据库中的事务,核心配置在DB中的由DBA设置,我们在JAVA层的操作准确的说是事务传播属性

    首先说一下关系数据库中的事务特性

    事务的 特性(ACID特性)

    A:原子性(Atomicity)
        事务是数据库的逻辑工作单位,事务中包括的诸操作要么全做,要么全不做。
    B:一致性(Consistency)
        事务执行的结果必须是使数据库从一个一致性状态变到另一个一致性状态。一致性与原子性是密切相关的。
    C:隔离性(Isolation)
       一个事务的执行不能被其他事务干扰。
    D:持续性/永久性(Durability)
       一个事务一旦提交,它对数据库中数据的改变就应该是永久性的

    然后在事务中存在的问题准确的说是有一些根据不同的隔离级别或业务要求是允许的

    1、幻想读:事务T1读取一条指定where条件的语句,返回结果集。此时事务T2插入一行新记录,恰好满足T1的where条件。然后T1使用相同的条件再次查询,结果集中可以看到T2插入的记录,这条新纪录就是幻想。
    2、不可重复读取:事务T1读取一行记录,紧接着事务T2修改了T1刚刚读取的记录,然后T1再次查询,发现与第一次读取的记录不同,这称为不可重复读。
    3、脏读:事务T1更新了一行记录,还未提交所做的修改,这个T2读取了更新后的数据,然后T1执行回滚操作,取消刚才的修改,所以T2所读取的行就无效,也就是脏数据。


    引用来自“卧枝会中田”的评论

    首先明确一点,关系数据库中的事务,核心配置在DB中的由DBA设置,我们在JAVA层的操作准确的说是事务传播属性

    首先说一下关系数据库中的事务特性

    事务的 特性(ACID特性)

    A:原子性(Atomicity)
        事务是数据库的逻辑工作单位,事务中包括的诸操作要么全做,要么全不做。
    B:一致性(Consistency)
        事务执行的结果必须是使数据库从一个一致性状态变到另一个一致性状态。一致性与原子性是密切相关的。
    C:隔离性(Isolation)
       一个事务的执行不能被其他事务干扰。
    D:持续性/永久性(Durability)
       一个事务一旦提交,它对数据库中数据的改变就应该是永久性的

    然后在事务中存在的问题准确的说是有一些根据不同的隔离级别或业务要求是允许的

    1、幻想读:事务T1读取一条指定where条件的语句,返回结果集。此时事务T2插入一行新记录,恰好满足T1的where条件。然后T1使用相同的条件再次查询,结果集中可以看到T2插入的记录,这条新纪录就是幻想。
    2、不可重复读取:事务T1读取一行记录,紧接着事务T2修改了T1刚刚读取的记录,然后T1再次查询,发现与第一次读取的记录不同,这称为不可重复读。
    3、脏读:事务T1更新了一行记录,还未提交所做的修改,这个T2读取了更新后的数据,然后T1执行回滚操作,取消刚才的修改,所以T2所读取的行就无效,也就是脏数据。


    2020-06-12 15:51:30
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
云栖社区特邀专家徐雷Java Spring Boot开发实战系列课程(第20讲):经典面试题与阿里等名企内部招聘求职面试技巧 立即下载
微服务架构模式与原理Spring Cloud开发实战 立即下载
阿里特邀专家徐雷Java Spring Boot开发实战系列课程(第18讲):制作Java Docker镜像与推送到DockerHub和阿里云Docker仓库 立即下载

相关实验场景

更多