事务居然有回滚,那么为什么会出现数据库的表一直无法写入的情况 1C

a和b两个事务发生资源冲突,其中一个事务回滚,另一个是继续执行下去,但是为什么还会发生锁表一直无法写入的情况

3个回答

是不是你的事物 的传播方式 引起的

我们这里一个个分析吧
1: PROPAGATION_REQUIRED
加入当前正要执行的事务不在另外一个事务里,那么就起一个新的事务
比如说,ServiceB.methodB的事务级别定义为PROPAGATION_REQUIRED, 那么由于执行ServiceA.methodA的时候,
ServiceA.methodA已经起了事务,这时调用ServiceB.methodB,ServiceB.methodB看到自己已经运行在ServiceA.methodA
的事务内部,就不再起新的事务。而假如ServiceA.methodA运行的时候发现自己没有在事务中,他就会为自己分配一个事务。
这样,在ServiceA.methodA或者在ServiceB.methodB内的任何地方出现异常,事务都会被回滚。即使ServiceB.methodB的事务已经被
提交,但是ServiceA.methodA在接下来fail要回滚,ServiceB.methodB也要回滚
2: PROPAGATION_SUPPORTS
如果当前在事务中,即以事务的形式运行,如果当前不再一个事务中,那么就以非事务的形式运行
这就跟平常用的普通非事务的代码只有一点点区别了。不理这个,因为我也没有觉得有什么区别
3: PROPAGATION_MANDATORY
必须在一个事务中运行。也就是说,他只能被一个父事务调用。否则,他就要抛出异常。
4: PROPAGATION_REQUIRES_NEW
这个就比较绕口了。 比如我们设计ServiceA.methodA的事务级别为PROPAGATION_REQUIRED,ServiceB.methodB的事务级别为PROPAGATION_REQUIRES_NEW,
那么当执行到ServiceB.methodB的时候,ServiceA.methodA所在的事务就会挂起,ServiceB.methodB会起一个新的事务,等待ServiceB.methodB的事务完成以后,
他才继续执行。他与PROPAGATION_REQUIRED 的事务区别在于事务的回滚程度了。因为ServiceB.methodB是新起一个事务,那么就是存在
两个不同的事务。如果ServiceB.methodB已经提交,那么ServiceA.methodA失败回滚,ServiceB.methodB是不会回滚的。如果ServiceB.methodB失败回滚,
如果他抛出的异常被ServiceA.methodA捕获,ServiceA.methodA事务仍然可能提交。
5: PROPAGATION_NOT_SUPPORTED
当前不支持事务。比如ServiceA.methodA的事务级别是PROPAGATION_REQUIRED ,而ServiceB.methodB的事务级别是PROPAGATION_NOT_SUPPORTED ,
那么当执行到ServiceB.methodB时,ServiceA.methodA的事务挂起,而他以非事务的状态运行完,再继续ServiceA.methodA的事务。
6: PROPAGATION_NEVER
不能在事务中运行。假设ServiceA.methodA的事务级别是PROPAGATION_REQUIRED, 而ServiceB.methodB的事务级别是PROPAGATION_NEVER ,
那么ServiceB.methodB就要抛出异常了。
7: PROPAGATION_NESTED
理解Nested的关键是savepoint。他与PROPAGATION_REQUIRES_NEW的区别是,PROPAGATION_REQUIRES_NEW另起一个事务,将会与他的父事务相互独立,
而Nested的事务和他的父事务是相依的,他的提交是要等和他的父事务一块提交的。也就是说,如果父事务最后回滚,他也要回滚的。
而Nested事务的好处是他有一个savepoint。

lyl18293847096
lyl18293847096 的事务是设在实现层,你这个是针对service层的吧
大约 3 年之前 回复

我的事务是设在实现层,你这个是针对service层的吧

关联模式是什么样的呢

lyl18293847096
lyl18293847096 事物与非事务共同竞争一张表会出现什么情况?
大约 3 年之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
解决mysql LOCK TABLES 后事务无法回滚的问题
在spring mvc+ mybatis中定义了一个事务,事务是service 层的一个方法fun1如 try{ .... lock tables ... }finally{ unlock tables...; } 坑来了,这样会导致fun1不会回滚,解决是在Controller层来释放锁,即锁释放不能在fun1中释放, 如 public ModelAndView handleRequ
MySQL的存储引擎造成的事务无法回滚
MySQL中表引擎造成的不能建立外键,事务不能回滚的问题
如何通过程序实现同一事务中多次数据库更新的错误回滚?
 具体情况是:begin transaction //使用程序来完成对事务的控制。// connect databaseupdate the first row // update successfullyupdate the second row// fail to update due to connection lost.  这个时候我怎么实现Roll back 第一
事务的回滚和不提交的区别
当出现异常,事务没有提交,不回滚有影响吗? 1. 在同一事务条件下,回滚和不提交,表现是一样的 但是还有些差别 事务处理,是将操作事件交给数据库(模拟)运行,直到commit操作,才使得修改实际产生效果,你可以看做是未提交事务都是处于一个临时库中进行 回滚是对于同一个事务,如果产生了错误,那么取消这个临时库中的操作,不对实际数据产生影响 最主要的区别在于,如果不
MySql数据库事务正常提交,回滚失败
问题:在初次练习Mysql数据库事务时,事务正常提交,但是在遇到异常应当回滚时,回滚失败。 代码如下://2.更新操作。 public void update(Connection conn, String sql, Object ...objects){ PreparedStatement preparedstatement = null; try {
关于Spring的@Transactional注解失效以及事务无法回滚问题
关于Spring的@Transactional注解失效以及事务无法回滚问题@Transactional失效问题最近写的项目中需要一个service中的部分事务执行完就被commit,但是部分service需要失败回滚。因此写在一个大的service中并且加上@Transactional显然是无法满足需求的。 因此这是需要把原先的一个service服务拆分,如原先的serviceA被拆分成servic
MySQL 事务没有提交导致锁等待
执行简单的update语句失效:报错 Lock wait timeout exceeded; try restarting transaction 解决办法: 1、 ps -ef | grep mysql  找到mysql安装路径 2、cd mysql路径-->进入bin,执行mysql -uroot -p进入命令行 3、查看数据库的隔离级别: mysql> sel
truncate 操作在事务里默认是不能回滚的
就这一句:     truncate 操作在事务里默认是不能回滚的
MySql中无法回滚的原因及解决办法
今天在编写程序的时候进行了回滚操作,程序运行正常,但是数据库并没有进行回滚操作。百度后发现自己创建的表类型是MyISAM,不支持事务操作,后改为InnoDB即能进行回滚操作。下面简单介绍两种数据表类型以及更改数据库类型为InnoDB的操作。 一 MySql支持的数据引擎 MyISAM:默认的MySQL插件式存储引擎,它是在Web、数据仓储和其他应用环境下最常使用的存储引擎之一。 InnoDB
spring事务控制的方法中抛出异常不回滚
最近做项目时,由于业务需要,在service中抛出自定义异常时出现了事务不回滚的情况,具体情况如下:
在sqlserver中使用事务的注意事项
这两天在项目开发中遇到一些业务逻辑需要进行大量的计算和数据的一致性,因此使用到sql事务和try catch。在项目需求中,多个业务逻辑单元分别写在对应的存储过程中,并进行事务控制,同时需要一个总调用的存储过程pro_contry,这个总调用de 存储过程pro_contry通过事务封装上面的所有业务逻辑单元存储过程,当其中任何一个存储过程出现错误时,全部回滚。pro_contry调用过程中发现同
在Spring中发生的SQL异常可以触发事务回滚的原因
在对Spring的事务回滚捕获的异常类型进行测试,发现当出现SQL异常时可以触发事务回滚,但是通过查看文档发现,Java.lang.SQLExcepetion是Java.lang.Excepetion的子类,在没有对事务设置rollbackfor=Exception.class时是不会默认对捕获的Excepetion类型异常触发事务回滚操作,而实际情况却与此相反,触发了事务回滚。经过查阅相关资料,...
oracle 数据库事务,提交,回滚,保存点,表的锁定,隐式锁,显示锁,写锁,读锁,排他锁,共享锁
数据库事务的概念 事务是由相关操作构成的一个完整的操作单元。两次连续成功的COMMIT或ROLLBACK之间的操作,称为一个事务。在一个事务内,数据的修改一起提交或撤销,如果发生故障或系统错误,整个事务也会自动撤销。 比如,我们去银行转账,操作可以分为下面两个环节: (1) 从第一个账户划出款项。 (2) 将款项存入第二个账户。 整个交易过程,可以看作是一个事物,成功则全部成功,失败则需
EntiryFramework中事务操作(三)事务回滚数据模型和数据库不对应问题
一、关于事务回滚数据模型和数据库不对应问题 1.在使用事务时,无论是使用DbContextTransaction,还是使用TransactionScope,如果在事务中出现异常而回滚,都有可能出现这种情况,数据库数据已经回滚,但是实体模型缓存没有回滚。出现数据的不一致行。 2.这种情况出现的原因:    1.EF中对于查询的实体对象在内存中有缓存,用于数据的状态跟踪,提升性能。    2.
接收到普通Exception,事务无法回滚解决方案
代码写法: 1 @Transactional(propagation = Propagation.REQUIRED, rollbackFor = { Exception.class }) 2 public void delRules(Integer id,String type) throws Exception { 3 ruleProductMapper.del
MyBatis入门 增删改要提交事务异常回滚 不然数据库是不改变的 查的话就不用
2018年1月11日 20:49:21 上课 第一步骤 建立库 表 CREATE DATABASE USER; USE USER; CREATE TABLE USER( uId INT(10) AUTO_INCREMENT NOT NULL PRIMARY KEY, uName VARCHAR(20), uPwd VARCHAR(20) ); DESC USER
为什么 Redis 不支持回滚(roll back)
鉴于没有任何机制能避免程序员自己造成的错误, 并且这类错误通常不会在生产环境中出现, 所以 Redis 选择了更简单、更快速的无回滚方式来处理事务。
数据库锁表原因分析
账户在清、结算流水插入中出现
MySql事务无法回滚的原因
使用MySQL时,如果发现事务无法回滚,但Hibernate、Spring、JDBC等配置又没有明显问题时,不要苦恼,先看看MySQL创建的表有没有问题,即表的类型。 InnoDB和MyISAM是在使用MySQL最常用的两个表类型,各有优缺点,视具体应用而定。基本的差别为:MyISAM类型不支持事务处理等高级处理,而InnoDB类型支持。MyISAM类型的表强调的是性能,其执行数度比InnoDB类型更快,但是不提供事务支持,而InnoDB提供事务支持已经外部键等高级数据库功能。
TP的事务回滚
事务支持 ThinkPHP提供了单数据库的事务支持,如果要在应用逻辑中使用事务,可以参考下面的方法: 启动事务: $User->startTrans();   提交事务: $User->commit();  事务回滚: $User->rollback(); 事务是针对数据库本身的,所以可以跨模型操作的 。 例如: //  在U
事务回滚后,自增ID仍然增加
回滚后,自增ID仍然增加。 比如当前ID是7,插入一条数据后,又回滚了。 然后你再插入一条数据,此时插入成功,这时候你的ID不是8,而是9. 因为虽然你之前插入回滚,但是ID还是自增了。 如果你认为自增ID不应该被事务化,那么其他事务不得不等待着,检查自增ID是被使用还是被回滚,这就导致阻塞。比如下面的例子,A表使用自增ID。 User 1 ------------ be
mysql 创建表不能使用“事务”回滚
需求:由于当初设计,往“项目表”中添加一条数据,就分别要创建“样本表”和“结果表”。   我当初的想法就是希望上面一连串的动作就是一个事物,如果只要是出现了异常,结果就是插入数据库不成功,并且创建数据库失败,但是测试了两天,使用了spring事务的很多种方式,还是不行,但是只要不创建数据库就没有任何问题,因此怀疑就是创建表实际上是不支持事务的。   那么上面的需求怎么解决呢? 解决办法:
令人郁闷的“事务中的变量赋值错误”
           事务中的变量(包括表变量)的操作是不受事务控制的。但是反过来,事务中的变量操作失败,却会导致事务提交失败,这个有点让人郁闷。         下面的脚本演示这个问题。示例演示分拆以逗号分隔的 @ids 中的每个 id, 如果这个 id 是数字(int型),则做后面的处理;如果不是数字(赋值失败,进入CATCH块),则跳过这个id,处理下一个。整个处理在一个事务中进行。
MySql 执行事务无效无法回滚问题
原因:检查数据库引擎是否为不支持事务的引擎(MyISAM),改为InnoDB即可。 参考链接: mysql表类型MyISAM和InnoDB区别(mysql 不支持事务解决)
spring 事务是否会回滚的几种写法
spring 事务注解 默认遇到throw new RuntimeException("...");会回滚 需要捕获的throw new Exception("...");不会回滚 // 指定回滚 @Transactional(rollbackFor=Exception.class) public void methodName() { // 不会回滚 t
别使用嵌套事务
公司之前一直存在一个规范,就是禁止嵌套事务的使用,一直不太明白为什么,试了下应该是无法控制回滚,今天看大牛的博客发现,问题远远不只如此。 具体总结下来是以下3个问题 1、内层事务回滚,只能回滚全部事务,无法控制单一事务回滚 2、内层事务提交后,回滚外层事务,也会把内层提交了的事务一起回滚 3、因为2的原因,只要整个事务不完全提交,日志空间都无法被释放     嵌套事务可不会像
mysql引擎从MYSIAM型修改成INNODB类型后事物回滚无效
//TODO
DB2回滚过程查看
今天数据库回滚一直没有出来,并且几个小时都没有响应,最终决定咨询IBM800人员,告诉几个命令,可以查看数据的回滚情况db2pb -db DBNAME -reco --查看当前主节点回滚情况db2pd -db DBNAME -reco -alldbp --查看当前主机所有分区的回滚情况 执行结果说明:Database Partition 0 -- Database DBNAME
数据库事务调度的可恢复性和级联回滚
对于一次调度其中涉及的相关事务,无论是什么原因,如果事务Ti失败了,为保证事务的原子性我们必须撤消该事务对数据库造成的影响,即将事务Ti回滚。同时由于系统中事务的并发执行,还必须确保那些依赖于Ti的任何事务Tj(即Tj读取了由Ti所写的数据)也必须同时撤消掉(即回滚掉)
Oracle的DDL语句为什么不能回滚
DDL语句为什么不能回滚        在ITPUB上看到有人提出了这个问题。在Sqlserver或一些其他的数据库中,DDL语句也是可以回滚的,那么Oracle为什么不能回滚DDL语句呢。 这个问题来自:http://www.itpub.net/thread-1300088-1-5.html          要说明这个问题,首先需要说明什么是DDL语句。DDL语
Spring事务为什么不会自动回滚?Spring事务怎样才会自动回滚?事务自动回滚条件及手动回滚
在此,首先我们要明确RuntimeException与Exception之间的关系与他们分别的含义:        ①在Java中异常的基类为Throwable,他有两个子类Exception与Errors,同时RuntimeException就是Exception的子类;        ②RuntimeException,即运行时异常,为非受检(UNCHECKED)异常;
关于Spring事务管理无法回滚的问题
这几天在学习spring事务管理,遇到了一个问题,什么配置都做了,什么方法都试了,但是在事务中抛出异常后,就是无法回滚,也就是事务管理没有生效。真的找不到问题! 最后发现了是因为我对数据库的操作是直接获取了数据源的连接,这些操作在spring容器之外,不受spring容器管理,所以spring事务无法管理,只要用在spring容器中配置的jdbcTemplate来执行数据库操作,或者使用一些和s
Mysql事务详解(一)事务的概念,四大特性,使用和回滚
以往的时候在java中,下面一个语句就可以操作一条数据库语句Class.forName("com.mysql.jdbc.Driver");//加载相应的字节码文件,把类加载到java虚拟机的方法区中(以后会详细讲解jvm的内存模型)conn = DriverManager.getConnection(url, user, password);//获取连接 stmt = conn.prepare
在事物中try catch但未抛出异常,导致事务未回滚
在事物中try catch但未抛出异常,导致事务未回滚
spring默认的事物回滚机制,当发生runtimeexception是不会回滚的
spring默认的事物回滚机制,当发生runtimeexception是不会回滚的
MySQL 的异常与事务结合的使用方法。并带自动回滚!
MySQL 的异常与事务结合的使用方法。并带自动回滚!DELIMITER $$ DROP PROCEDURE IF EXISTS test_sp1 $$ CREATE PROCEDURE test_sp1(i INT) BEGIN DECLARE t_error INTEGER DEFAULT 0;DECLARE CONTINUE HANDLER FOR SQLEX
JDBC对事务的使用(包括自动提交,回滚等知识)
首先得清楚什么时候使用事务。     当你需要一次执行多条SQL语句时,可以使用事务。通俗一点说,就是,如果这几条SQL语句全部执行成功,则才对数据库进行一次更新,如果有一条SQL语句执行失败,则这几条SQL语句全部不进行执行,这个时候需要用到事务。     其次才是事务的具体使用。  1.获取对数据库的连接(代码这里省略了吧,网上太多了,对各种数据库的连接的都有)  2.设置事务不自动提交(默认...
为什么mysql事务回滚后, 自增ID依然自增
mysql事务回滚数据回滚用法与问题-mysql教程-数据库-壹聚教程网  http://www.111cn.net/database/mysql/53781.htm 事务回滚后,自增ID仍然增加 - DB2数据库栏目 - 红黑联盟  http://www.2cto.com/database/201107/96110.html 事务回滚后,自增ID仍然增
jdbc事物提交,回滚不起作用的解决方案
今天在写程序的时候发现一个奇怪的问题: 明明设置了事物非自动提交,但是当 回滚后,更新操作还是被执行了,并且不报任何错误. 下面是代码,代码是没有问题的: import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.Stat
Redis事务为什么不支持回滚
在事务运行期间,虽然Redis命令可能会执行失败,但是Redis仍然会执行事务中余下的其他命令,而不会执行回滚操作,你可能会觉得这种行为很奇怪。然而,这种行为也有其合理之处:只有当被调用的Redis命令有语法错误时,这条命令才会执行失败(在将这个命令放入事务队列期间,Redis能够发现此类问题),或者对某个键执行不符合其数据类型的操作:实际上,这就意味着只有程序错误才会导致Redis命令执行失败,...
oracle 数据库并行事务回滚导致ORA-600&&ORA-30319报错实例被smon终止
由于oracle并行事务被强制取消,oracle并行事务回滚引起oracle数据库相关的表空间、操作系统cpu、内存、io耗尽导致数据库被smon异常终止,此故障可以通过服务重启解决,但是重启oracle数据库依然需要回滚事务,需要监控数据库相关的表空间、 操作系统内存、io等资源,并且回滚的时间可能比较长。
数据库多表操作事务处理
在需要同时插入多条数据时,这其中可能是同一个表的多条记录,也可能是多个不同表之间的数据同时更新。对此,我们需要保证其中的原子性和一致性,做到要么全部操作都能全部成功完成,否则全部不操作。 我们可以通过SQL的事务来对相关数据库操作进行处理,在开始conn.setAutoCommit(false);(conn是或得的连接)把本次运行的SQL操作改为非自动运行,在配置好各SQL语句之后,调用conn.commit();来运行,其中通过try{……}catch……来捕捉异常,如果遇到错误时,就调用co
php中mysql事务回滚无效
我的测试环境:AppServ <?php header("Content-type:text/html;charset=utf-8"); $pdo = new PDO('mysql:host=localhost;dbname=data','root','root'); $pdo->exec('set names utf8'); $pdo->s...
在SQL SERVER中实现事务的部分回滚
在SQL SERVER中实现事务的部分回滚1.保存点:是一种实现部分回滚的方法。可以给一个保存点起一个名字,以便在后面的事务中可以回滚到保存点。 2.实现代码。BEGIN TRANSACTION Transaction_Name<br />SQL_Statement1<br />SQL_Statement2    SAVE TRANSACTION Save_Name --设置保存点   SQL_Statement3<br />SQL_Statement4IF Test_Condition_Fails   
为什么Redis不支持回滚?
如果你具备关系型数据库的知识背景,你就会发现一个事实:在事务运行期间,虽然Redis命令可能会执行失败,但是Redis仍然会执行事务中余下的其他命令,而不会执行回滚操作,你可能会觉得这种行为很奇怪。 然而,这种行为也有其合理之处: 只有当被调用的Redis命令有语法错误时,这条命令才会执行失败(在将这个命令放入事务队列期间,Redis能够发现此类问题),或者对某个键执行不符合其数据类型的操作:...
使用JDBCTMEPLATE插入数据时,事务不回滚
最近项目用到JDBCTEMPLATE,发现一个问题,当插入数据抛出异常时事务没有回滚,数据还是 保存进了数据库中。开始以为是事务配置问题。把SPRING各种配置都查了一遍,网上最多的就是 MVC的CONTROLLER配置文件和CONTEXT的SERVICE组件的扫描一定要分开。检查了之后发现 不是这个问题。后来各种测试,发现同一个方法,删除、修改的事务都可以回滚,只有保存的事务 不可以回滚
配置了AOP报错后事务并未回滚
原文地址:https://blog.csdn.net/xianymo/article/details/50696392 &amp;lt;tx:advice id=&quot;txAdvice&quot; transaction-manager=&quot;transactionManager&quot;&amp;gt; &amp;lt;tx:attributes&amp;gt; &amp;lt;!-- 传播行为 --&amp;gt; &amp;lt;tx:method na...
spring 声明式事务配置,抛出runtimeException异常不回滚
默认spring只在发生未被捕获的runtimeexcetpion时才回滚。   最容易解决的办法:代码级控制:TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();   try{ ... }catch(Exception e){ log.error(e.getMessage(),e)
sql异常,Spring Aop事务不回滚解决方案
在做Spring声明式事务的时候,数据库连接池是HikariCP, 如果sql报错,比如某一个字段can’t be null, 这种sql exception就无法回滚,但是如果是1/0报错,事务就可以回滚,在网上查了很多资料,试了下面几个方法: 1. 检查mysql是否是innodb? 2. 自定义异常; 3. throw new RuntimeException(); 4. 在try ...
在Spring Boot中使用数据库事务
我们在前面已经分别介绍了如何在Spring Boot中使用JPA(初识在Spring Boot中使用JPA)以及如何在Spring Boot中输出REST资源( 在Spring Boot中输出REST资源)。那么关于数据库访问还有一个核心操作那就是事务的处理了,前面两篇博客小伙伴们已经见识到Spring Boot带给我们的巨大便利了,其实不用猜,我们也知道Spring Boot在数据库事务处理问题上
相关热词 c# id读写器 c#俄罗斯方块源码 c# linq原理 c# 装箱有什么用 c#集合 复制 c# 一个字符串分组 c++和c#哪个就业率高 c# 批量动态创建控件 c# 模块和程序集的区别 c# gmap 截图
立即提问