No transaction aspect-managed TransactionStatus in scope
分布式事务处理TransactionScope 和 非分布式事务处理TransactionScope它的用途是为数据库访问提供了一个“轻量级” 区别于:SqlTransaction 的事物TransactionScope这个事务自身还封装了多个数据库查询。只要任意一个 SqlCommand 对象引发异常,程序流控制就会跳出 TransactionScope 的 using 语句块,随后,TransactionScope 将自行释放并回滚该事务。由于这段代码使用了 using 语句,所以 SqlConnection 对象和 TransactionScope 对象都将被自动调用Dispose()释放。由此可见,只需添加很少的几行代码,您就可以构建出一个事务模型,这个模型可以对异常进行处理,执行结束后会 自行清理,此外,它还可以对命令的提交或回滚进行管理。TransactionScope在文档中宣称只在“必要”情况下才提升事务级别(多数据库时才使用分布式事务,如果是同一个数据库,最好使用SqlTransaction),但是事实上不是这样。在TransactionScope内,只要你用不同的SqlConnection对象操作DB一次以上(不管你的目标是不是同一个实例、同一个库),都会提升事务级别到分布式事务。使用分布式事务注意如下几点1:确保参与事务的machine开启了分布式事务支持;2:如果machine开启了防火墙,需要设置msdtc进程为例外;3:参与事务的machine不能跨域(如果跨域,目前微软还没有确切的解决方案);4:多数据库时才使用分布式事务,如果是同一个数据库,最好使用SqlTransaction.大部分都是用SqlTransaction这个类来在程序代码中保证事务性,但是SqlTransaction是与SQL Server数据库相关的类,如果将这个类用在了B层,那么就突破了三层架构的底线了,如果将来换数据库(比如从SQL Server换到Oracle),D层和B层都得重写,所以这样做的局限性很大。用TransactionScope,这个类是与具体数据库无关的类,用这个类来保证B层的事务性十分可行。示例://// /// 发送消息 /// /// /// 格式7FFA3AF2-E74B-4174-8403-5010C53E49A7|userName,7FFA3AF2-E74B-4174-8403-5010C53E49A7|userName /// /// 表示已送 /// public static int sendMessage(string sendUserId, string toUser, string content, string sendedStatus) { int receiveCount = 0; TransactionOptions transactionOption = new TransactionOptions(); //设置事务隔离级别 transactionOption.IsolationLevel = System.Transactions.IsolationLevel.ReadCommitted; // 设置事务超时时间为60秒 transactionOption.Timeout = new TimeSpan(0, 0, 60); using (TransactionScope scope = new TransactionScope(TransactionScopeOption.Required, transactionOption)) { try { //在这里实现事务性工作 //发送消息 insertMessage(sendUserId, toUser, content, sendedStatus); //在接收信息表中插入记录 receiveCount += insertReceiveMessage(userids[0], sendUserId, content, "0"); // 没有错误,提交事务 scope.Complete(); } catch (Exception ex) { throw new Exception("发送信息异常,原因:"+ex.Message); }finally{ //释放资源 scope.Dispose(); } } return receiveCount; }
表里已存在相同的数据,也就是记录里某字段有重复值,把重复值清理掉之后,就不会报错了
。。。
因为有某个字段是不能重复的,但是现在插入了重复的值。。。
<!-- 定义事务管理器 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean>
<!-- 开启事务控制的注解支持 -->
<tx:annotation-driven transaction-manager="transactionManager"/>
原因二:如果你使用了AOP切面事务,请确定Spring Aop Execution表达式是否正确的扫描了Service层接口或实现类,如下所示:
<!-- 定义事务策略 -->
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<!-- 所有以query开头的方法都是只读的
<tx:method name="query*" read-only="true" />
<tx:method name="get*" read-only="true" />
<tx:method name="find*" read-only="true" />
<tx:method name="select*" read-only="true" />
<!-- 其他方法使用默认事务策略 -->
<tx:method name="*" rollback-for="Throwable"/>
</tx:attributes>
</tx:advice>
<aop:config>
<aop:pointcut id="myPointcut" expression="execution(* com.voavoice.service.*.*(..))" />
<!-- 将定义好的事务处理策略应用到上述的切入点 -->
<aop:advisor advice-ref="txAdvice" pointcut-ref="myPointcut" />
</aop:config>
原因三:这是最应该注意的一点,在springmvc xml视图解析器配置中,很多人在<context:component-scan>自动扫描时本来只需要扫描Controller的,但是他扫描的范围过大,扫描了所有的包,会造成事务失效,如下:
<!-- 描述conctroller -->
<context:component-scan base-package="com.voavoice.english.controller"/>
<!-- 错误的扫描成如下这样 -->
<context:component-scan base-package="com.voavoice.english"/>
所以在springmvc配置中最好只扫描Controller下面的类,而在spring context上下文配置中把扫描范围放大就不会有事!
原因四:还可能是pring AOP代理不支持类内部方法调用导致的,就是同一个Service中a方法调用b方法。Spring官方也不推荐使用类内部方法相互调用,一个是代理对象、一个是目标对象,Spring没办法对目标对象进行事务切面处理。有很多成熟的方案可以解决这个问题,比如开启AOP代理ThreadLocal支持或者Service中声明一个自我的引用对象,通过这个自我引用对象(代理对象)开启事务,还有一个方案就是通过实现BeanPostProcessor 接口取得代理对象。
例如:1、在XML配置文件中增加
<aop:aspectj-autoproxy expose-proxy="true"/><!—注解风格支持-->
<aop:config expose-proxy="true"><!—xml风格支持-->
2、修改的业务实现类
AService中a()调用this.b();-----------修改为--------->((AService) AopContext.currentProxy()).b();
a()可以不开启事务,b()开启事务即可。
原因五:手动回滚之前必须声明该方法被事务管理@Transactional(rollbackFor = Exception.class),此时手动回滚才能生效,事务注解相当于开启事务transactionManager.commit(status);所以,
@Transactional(rollbackFor = Exception.class)+TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
原因六:开启事务的方法必须声明为public
综上所述,这是最全的解决资料了,我就是参考以上步骤解决了问题。
宏姚鸢都: ”因为客户端A需要一个X 锁定来删除该行,所以在这里发生死锁.尽管如此,锁定请求不被允许,因为客户端B已经有一个对X锁定的请求并且它正等待客户端A释放S锁定.因为客户端B之前对X 锁定的请求,被客户端A持有的S锁定也不能升...
新城区17325776503: linuxRedhat 64位在安装rac时,因需要安装I386包,但安装时报错 as notransaction,求解救 - ?
宏姚鸢都: 不明白啊 = =!
新城区17325776503: 往其他数据库插入数据,提示"No transaction is active." - ?
宏姚鸢都: 从代码看,好像没错 你试试,把 TRANSACTION相关代码先去掉执行一下.再找问题
新城区17325776503: 速达财务软件在结账最后时出现(no user transaction is currently in progree)结不了帐,怎么办? - ?
宏姚鸢都: 结账时,其他的电脑的客户端就先退出,保证只有你的电脑进入客户端,然后重新结转.
新城区17325776503: 速达3000XP,选择帐套或关闭帐套时,提示"No user transaction is currently in progress" ,如何处理?
宏姚鸢都: 退出速达软件,重新启动interbase服务器, 运算量比较大的情况下容易出现这种提示,建议提高硬件的设备
新城区17325776503: 配置了事务,为什么maven还提示no transaction manager found - ?
宏姚鸢都: .类找不到,...java扩展包中的事务管理类. 如果你的项目中用了spring,那么就是spring跟其他orm框架进行整合的时候所用到的类.
新城区17325776503: no user transaction is currently in progress是什么意思 - ?
宏姚鸢都: no user transaction is currently in progress 翻译:当前没有交易正在进行中.补充: transaction :交易,业务,事务; 办理,处理; (一笔)交易,(一项)事务; (学会等的)会议记录,学报; 例句:1、The transaction closed on jan.这...
新城区17325776503: CALL存储过程,报错.该怎么处理 - ?
宏姚鸢都: 一、存储过程中使用事务的简单语法 在存储过程中使用事务时非常重要的,使用数据可以保持数据的关联完整性,在Sql server存储过程中使用事务也很简单,用一个例子来说明它的语法格式: 12345678910111213 Create Procedure ...
新城区17325776503: commit可以和哪些词搭配,不可以和哪些词搭配? - ?
宏姚鸢都: commit vt.犯(错误),干(坏事),把…交托给,提交,答应负责 commit oneself (on)表达个人的意见commit to memory记住;牢记commit an error做错事commit a crime犯罪commit suicide自杀commit ones soul to God将自己的灵魂托与...
新城区17325776503: InvalidTransaction是什么意思 - ?
宏姚鸢都: Invalid Transaction 无效的事务 双语例句1 Invalid transaction or no transaction pending.无效事务或不存在挂起的事务.2 Invalid transaction or invalid name for a point at which to save within the transaction.事务中要进行保存的点的事务或名称无效.