数据库事务管理:掺杂使用entityDao和jdbcTemplate时的问题

代码中有一个较大的事务,需要做多次数据库的增删改等操作。

其中一个新增操作我使用了公司封装的hibernate的entityDao;其它操作使用的是spring提供的jdbcTemplate。二者操作流程基本如下:

entityDao.save(写入表1)

jdbcTemplate.update(根据entityDao向表1写入的最新数据,更新表2)

结果,entityDao能够正确写入表1;但是jdbcTemplate的更新操作却始终失败(数据库操作正常结束,但应该被更新的数据没有被更新)。

烦了很久,最后把所有的sql和transaction管理日志全部打印出来,发现一个小问题。

entityDao
的相关事务,是hibernate管理的;但jdbcTemplate的事务,是根据代码中配置的@Transactional(propagation
= Propagation.REQUIRED, rollbackFor =
Exception.class),由JTATransactionInterceptor管理的。

这就是问题原因所在。二者的事务管理机制不一样,因此相当于在两个不同的事务中执行各自的数据库操作。jdbcTemplate在自己的事务中,是看不到entityDao写入它的事务、但暂时没有提交到数据库的数据库的。

总之:如果要进行数据库的增删改操作,要么统一使用entityDao,要么统一使用jdbcTemplate。不要混用。

时间: 2024-08-14 04:02:00

数据库事务管理:掺杂使用entityDao和jdbcTemplate时的问题的相关文章

数据库事务管理原理

数据库是一个共享资源,可以提供多个用户使用.这些用户程序可以一个一个地串行执行,每个时刻只有一个用户程序运行,执行对数据库的存取,其他用户程序必须等到这个用户程序结束以后方能对数据库存取.但是如果一个用户程序涉及大量数据的输入/输出交换,则数据库系统的大部分时间处于闲置状态.因此,为了充分利用数据库资源,发挥数据库共享资源的特点,应该允许多个用户并行地存取数据库.但这样就会产生多个用户程序并发存取同一数据的情况,若对并发操作不加控制就可能会存取和存储不正确的数据,破坏数据库的一致性,所以数据库管

深入Spring数据库事务管理(一)

配置事务管理器 <?xml version='1.0' encoding='UTF-8' ?> <!-- was: <?xml version="1.0" encoding="UTF-8"?> --> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSc

深入Spring数据库事务管理(二)

数据库的相关知识 1.数据库事务ACID特性 原子性(Atomicity): 说的是一个事物内所有操作共同组成一个原子包,要么全部成功,要么全部失败.这是最基本的特性,保证了因为一些其他因素导致数据库异常,或者宕机. 一致性(Consistency): 数据库事物的一致性就规定了事物提交前后,永远只可能存在事物提交前的状态和事物提交后的状态,从一个一致性的状态到另一个一致性状态,而不可能出现中间的过程态.也就是说事物的执行结果是量子化状态,而不是线性状态. 隔离性(Isolation): 事物的

多数据库事务管理(JTA)实现

最近实现一个后台管理项目,涉及到多数据库同步,就出现了事务问题,原来的设计springmvc+mybaties+druid数据源不可用,原来JDBC变为JTA. 设计变为:springmvc+mybateis+atomikos. maven依赖: com.atomikos atomikos-util ${atomikos.version} com.atomikos transactions-jta ${atomikos.version} com.atomikos transactions ${a

数据库事务管理及存储引擎

http://blog.csdn.net/xiaoyu714543065/article/details/8211265 事务具有四个特征:原子性( Atomicity ).一致性( Consistency ).隔离性( Isolation )和持续性( Durability ).这四个特性简称为 ACID 特性. MySQL5.5以后默认使用InnoDB存储引擎,其中InnoDB和BDB提供事务安全表,其它存储引擎都是非事务安全表.若要修改默认引擎,可以修改配置文件中的default-stor

数据库事务管理

数据库提供了四种事务隔离级别, 不同的隔离级别采用不同的锁类开来实现. 在四种隔离级别中, Serializable的级别最高, Read Uncommited级别最低. 大多数数据库的默认隔离级别为: Read Commited,如Sql Server , Oracle. 少数数据库默认的隔离级别为Repeatable Read, 如MySQL InnoDB存储引擎 即使是最低的级别,也不会出现 第一类 丢失 更新问题 . 1. 脏读(事务没提交,提前读取):脏读就是指当一个事务正在访问数据,

集算器管理数据库事务的代码示例

集算器可以向数据库写入数据,支持数据库事务管理.这里通过例子来看一下控制事务提交和回滚等等的编程方法. 1.自动提交事务 集算器可以方便的实现增删改,最简单的写法如下: 上图中的A2到A4分别实现了插入.修改和删除.每条sql执行之后自动提交.需要说明的是: 1.3条语句提交了3次,对数据库操作比较频繁. 2.三条sql没有事务关系,后续的sql如果执行失败,并不影响前面的sql. 下面介绍结合序表批量提交事务,以及多条sql组成一个事务的编程例子.     2.批量提交事务 从students

Spring3 (事务管理)

简介: 1.事务管理.2.整合Junit.3.整和Web 1       事务管理 1.1   回顾事务 l  事务:一组业务操作ABCD,要么全部成功,要么全部不成功. l  特性:ACID 原子性:整体 一致性:完成 隔离性:并发 持久性:结果 l  隔离问题: 脏读:一个事务读到另一个事务没有提交的数据 不可重复读:一个事务读到另一个事务已提交的数据(update) 虚读(幻读):一个事务读到另一个事务已提交的数据(insert) l  隔离级别: read uncommitted:读未提

spring事务管理及相关知识

最近在项目中遇到了spring事务的注解及相关知识,突然间感觉自己对于这部分知识只停留在表面的理解层次上,于是乎花些时间上网搜索了一些文章,以及对于源码的解读,整理如下: 一.既然谈到事务,那就先搞清到底什么是事务,或者说,Spring事务管理中的事务到底是指什么? 1.事务(Transaction),通常是指数据库的事务,在计算机术语中是指访问并可能更新数据库中各种数据项的一个程序执行单元(unit),例如insert .update.delete等,事务是恢复和并发控制的基本单位. 2.事务