精华内容
下载资源
问答
  • 主要介绍了使用SpringBoot注解方式处理事务回滚实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
  • 主要介绍了java事务回滚失败问题分析,具有一定借鉴价值,需要的朋友可以参考下
  • 主要介绍了springboot手动事务回滚的实现方法,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
  • 今天小编就为大家分享一篇在laravel中实现事务回滚的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
  • spring 事务回滚 1、遇到的问题  当我们一个方法里面有多个数据库保存操作的时候,中间的数据库操作发生的错误。伪代码如下: public method() { Dao1.save(Person1); Dao1.save(Person2); Dao1.save(Person2)...
  • 主要给大家介绍了关于mongoDB 4.0事务回滚的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用MongoDB具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
  • 执行多条SQL语句对数据库进行操作,如果某个SQL语句执行中出错,那么要对之前的操作进行回滚,代码比较简单。
  • 本篇文章主要介绍了浅谈Spring中@Transactional事务回滚及示例(附源码),小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
  • java 应用程序操作数据库实例,若出现sql异常则事务回滚
  • Spring/SpringMVC/MyBatis整合,可事务回滚
  • Spring+Mybatis整合事务回滚

    热门讨论 2014-11-23 03:14:12
    花了一晚上时间终于搞出来了Spring整合Mybatis事务回滚(Mysql数据库),控制Service层中的多次插入操作,多次操作整体是一个事务。 里面有缘嘛和jar包,资源为war包,导入即可。运行Test类中的测试代码即可。 建表...
  • 主要介绍了在Java的JDBC使用中设置事务回滚的保存点的方法,JDBC是Java用于连接各种数据库的API,需要的朋友可以参考下
  • sql 回滚语句这种情况的数据恢复只能利用事务日志的备份来进行,所以如果你的SQL没有进行相应的全库备份或不能备份日志(truncate log on checkpoint选项为1),那幺就无法进行数据的恢复了,或者只能恢复到最近一次的...

    sql 回滚语句

    这种情况的数据恢复只能利用事务日志的备份来进行,所以如果你的SQL没有进行相应的全库备份

    或不能备份日志(truncate log on checkpoint选项为1),那幺就无法进行数据的恢复了,或者

    只能恢复到最近一次的备份的数据了。

    以下简单说明恢复数据方法:

    1,如果误操作之前存在一个全库备份(或已有多个差异备份或增量备份),首先要做的事就是进

    进行一次日志备份(如果为了不让日志文件变大而置trunc. log on chkpt.选项为1那你就死翘了)

    backup log dbName to disk='fileName'

    2,恢复一个全库备份,注意需要使用with norecovery,如果还有其他差异或增量备份,则逐个恢

    restore database dbName from disk='fileName' with norecovery

    3,恢复最后一个日志备份即刚做的日志备份,指定恢复时间点到误操作之前的时刻

    restore log dbName from disk='fileName'

    with stopat='date_time'

    以上这些操作都可以在SQL SERVER企业管理器里完成,难度不大。。。

    当然,如果误操作是一些不记日志的操作比如truncate table,select into等操作,那幺是无法利

    用上述方法来恢复数据的...

    sql server能回滚?如我不小心执行了delete from record_qlq 怎幺回滚

    sqlserver 的编辑器一般都是默认自动提交,也就是说你删除后,就自动提交了;不能回滚。

    当然如果你设置成不是默认提交的话,那幺你在提交之前可以回滚。

    而如果是程序代码中删除的话,看你有没有启用事务,如果没有启用事务,那幺一般也是默认提交的,如果启用事务,那幺再提交前可以回滚,如果已经提交了,那幺就回滚不了了。

    数据库(sql server )回滚事务

    --开始一个事务处理

    Begin Tran T1

    --执行插入操作

    insert into [选课表]([学号],[课程代码]) values('20100021','01');

    insert into [选课表]([学号],[课程代码]) values('20100021','02');

    insert into [选课表]([学号],[课程代码]) values('20100021','03');

    --判断同一学号的选课数量是否符合

    IF(select count([学号]) as 空白t from [选课表] where [学号]='20100021')>4

    BEGIN

    --不符合,回滚事务

    rollback Tran T1

    END

    ELSE

    BEGIN

    --符合,提交事务

    空白mit Tran T1

    END

    sql server 2008 执行语句后怎幺恢复

    1、SQL的操作无法撤消,无法恢复.值改了就改了,没法退回.

    如果你有备份,因为数据库有新旧差异,不要直接在原数据库上做恢复,你把备份的数据恢复到一个新的数据库上,再看一下你修改的那个列表的原来的值是多少,再修改回这个值,就行了.

    直接操作数据库,请切记避免误操作,很烦的.

    2、或是你可以逆执行执行过的sql,比如insert的话用delete删除,不过这得视情况而定了

    SQL回滚的作用什幺?

    撤消操作

    如:

    begin tran

    insert t select 1

    rollback tran

    sql server 中的update语句回滚怎幺写啊

    回滚要放在事务里面进行,才能进行回滚;sql里面的事务使用关键字TransAction

    1:可以用try catch捕获

    begin try

    begin tran

    update table set a=1;

    空白mit tran

    end Try

    begin catch

    rollback tran

    end catch

    2:可以使用error 全局变量

    begin tran

    update tablename set ad=1111

    if @@error<>0 begin rollback end

    空白mit tran

    注意:如果一个事务写了 begin trans ,后面一定要跟上 空白mit tran或 rollback transaction ,否则可能导致被锁

    什幺样的sql可以回滚,什幺样的又不可以?

    对于SQL语言,有两个组成部分:

    DML(data manipulation language) 有:SELECT、UPDATE、INSERT、DELETE

    DDL(data definition language)DDL比DML要多,主要的命令有CREATE、ALTER、DROP等

    DML 需要显式回滚

    DDl是隐式提交的 不能回滚

    sql server事务回滚代码怎幺写

    事务回滚有几种,下面只是常见的一种

    declare???@iErrorCount???int

    set?@iErrorCount?=?0

    begin?tran?Tran1

    insert?into?t1(Id,?c1)?values(1,'1')

    set?@iErrorCount=@iErrorCount+@@error

    insert?into?t1(Id,?c1)?values('XX2','2')

    set?@iErrorCount=@iErrorCount+@@error

    if?@iErrorCount=0

    begin

    COMMIT?TRAN?Tran1??--执行事务

    end

    else

    begin

    ROLLBACK?TRAN?Tran1??--回滚事务

    end

    SQL语言中,用于事务回滚的语句是什幺?

    rollback

    SQL数据库,能进行回滚操作幺?

    回滚操作时有前提的

    得开事物才行

    如果默认

    就自动空白mit了

    如果是工具操作的

    应该有回滚按钮

    展开全文
  • 主要介绍了ThinkPHP实现事务回滚,需要的朋友可以参考下
  • 事务中,每个正确的原子操作都会被顺序执行,直到遇到错误的原子操作,此时事务会将之前的操作进行回滚回滚的意思是如果之前是插入操作,那么会执行删 除插入的记录,如果之前是update操作,也会执行update操作...
  • 自己做的一个简单的spring运用实例,主要是关于事务回滚的一个小例子,希望对还在纠结事务回滚的童靴有点帮助。。。
  • 问题:在Java项目汇中,添加@Transactional注解,报错之后,事务回滚未生效,数据仍插入数据库中.经查看报错位置位于新增成功之后.空指针异常.一、特性先了解一下@Transactional注解事务的特性,可以更好排查问题1、...

    问题:在Java项目汇中,添加@Transactional注解,报错之后,事务回滚未生效,数据仍插入数据库中.经查看报错位置位于新增成功之后.空指针异常.

    一、特性

    先了解一下@Transactional注解事务的特性,可以更好排查问题

    1、service类标签(一般不建议在接口上)上添加@Transactional,可以将整个类纳入spring事务管理,在每个业务方法执行时都会开启一个事务,不过这些事务采用相同的管理方式。

    2、@Transactional 注解只能应用到 public 可见度的方法上。 如果应用在protected、private或者 package可见度的方法上,也不会报错,不过事务设置不会起作用。

    3、默认情况下,Spring会对unchecked异常进行事务回滚;如果是checked异常则不回滚。

    辣么什么是checked异常,什么是unchecked异常

    java里面将派生于Error或者RuntimeException(比如空指针,1/0)的异常称为unchecked异常,其他继承自java.lang.Exception得异常统称为Checked Exception,如IOException、TimeoutException等

    通俗一点:你写代码出现的空指针等异常,会被回滚,文件读写,网络出问题,spring就没法回滚了。然后我教大家怎么记这个,因为很多同学容易弄混,你写代码的时候有些IOException我们的编译器是能够检测到的,说以叫checked异常,你写代码的时候空指针等死检测不到的,所以叫unchecked异常。这样是不是好记一些啦

    4、只读事务:

    @Transactional(propagation=Propagation.NOT_SUPPORTED,readOnly=true)

    只读标志只在事务启动时应用,否则即使配置也会被忽略。

    启动事务会增加线程开销,数据库因共享读取而锁定(具体跟数据库类型和事务隔离级别有关)。通常情况下,仅是读取数据时,不必设置只读事务而增加额外的系统开销。

    二.事务管理方式

    事务管理对于企业应用来说是至关重要的,即使出现异常情况,它也可以保证数据的一致性。

    spring支持编程式事务管理和声明式事务管理两种方式。

    编程式事务管理使用TransactionTemplate或者直接使用底层的PlatformTransactionManager。对于编程式事务管理,spring推荐使用TransactionTemplate。

    声明式事务管理建立在AOP之上的。其本质是对方法前后进行拦截,然后在目标方法开始之前创建或者加入一个事务,在执行完目标方法之后根据执行情况提交或者回滚事务。

    声明式事务管理也有两种常用的方式,一种是基于tx和aop名字空间的xml配置文件,另一种就是基于@Transactional注解。显然基于注解的方式更简单易用,更清爽。

    三.事务传播模式

    Propagation枚举了多种事务传播模式,部分列举如下:

    REQUIRED(默认模式):业务方法需要在一个容器里运行。如果方法运行时,已经处在一个事务中,那么加入到这个事务,否则自己新建一个新的事务。

    NOT_SUPPORTED:声明方法不需要事务。如果方法没有关联到一个事务,容器不会为他开启事务,如果方法在一个事务中被调用,该事务会被挂起,调用结束后,原先的事务会恢复执行。

    REQUIRESNEW:不管是否存在事务,该方法总汇为自己发起一个新的事务。如果方法已经运行在一个事务中,则原有事务挂起,新的事务被创建。

    MANDATORY:该方法只能在一个已经存在的事务中执行,业务方法不能发起自己的事务。如果在没有事务的环境下被调用,容器抛出例外。

    SUPPORTS:该方法在某个事务范围内被调用,则方法成为该事务的一部分。如果方法在该事务范围外被调用,该方法就在没有事务的环境下执行。

    NEVER:该方法绝对不能在事务范围内执行。如果在就抛例外。只有该方法没有关联到任何事务,才正常执行。

    NESTED:如果一个活动的事务存在,则运行在一个嵌套的事务中。如果没有活动事务,则按REQUIRED属性执行。它使用了一个单独的事务,这个事务拥有多个可以回滚的保存点。内部事务的回滚不会对外部事务造成影响。它只对DataSourceTransactionManager事务管理器起效。

    四.@Transactional注解的全部属性详解

    属性

    类型

    描述

    value

    String

    可选的限定描述符,指定使用的事务管理器

    propagation

    enum: Propagation

    可选的事务传播行为设置

    isolation

    enum: Isolation

    可选的事务隔离级别设置

    readOnly

    boolean

    读写或只读事务,默认读写

    timeout

    int (in seconds granularity)

    事务超时时间设置

    rollbackFor

    Class对象数组,必须继承自Throwable

    导致事务回滚的异常类数组

    rollbackForClassName

    类名数组,必须继承自Throwable

    导致事务回滚的异常类名字数组

    noRollbackFor

    Class对象数组,必须继承自Throwable

    不会导致事务回滚的异常类数组

    noRollbackForClassName

    类名数组,必须继承自Throwable

    不会导致事务回滚的异常类名字数组

    五.解决Transactional注解不回滚

    检查你方法是不是public的

    你的异常类型是不是unchecked异常

    如果我想check异常也想回滚怎么办,注解上面写明异常类型即可

    @Transactional(rollbackFor=Exception.class).类似的还有norollbackFor,自定义不回滚的异常

    数据库引擎要支持事务,如果是MySQL,注意表要使用支持事务的引擎,比如innodb,如果是myisam,事务是不起作用的

    是否开启了对注解的解析

    spring是否扫描到你这个包,如下是扫描到org.test下面的包

    检查是不是同一个类中的方法调用(如a方法调用同一个类中的b方法)

    异常是不是被你catch住了

    展开全文
  • 嵌套事务回滚

    2021-02-12 22:58:42
    嵌套事务回滚2017年05月02日 16:33:32阅读数:1974嵌套事务事务保存点的错误处理对于嵌套事务。1.外部起事务,内部起事务,内外都有Try Catch内部出错:如果内部事务出错,内部和外部事物全部回滚,外部回滚之前...

    嵌套事务的回滚

    2017年05月02日 16:33:32

    阅读数:1974

    嵌套事务和事务保存点的错误处理

    对于嵌套事务。

    1.外部起事务,内部起事务,内外都有Try Catch

    内部出错:如果内部事务出错,内部和外部事物全部回滚,外部回滚之前的操作全部不存在,但是之后的操作继续执行。

    外部出错:如果外部事物出错,内部和外部事物全部回滚,外部回滚之前的操作全部不存在,但是之后的操作继续执行。

    注:如果内部的事务不起事务名称,内部如果出错,将会回滚掉会话中的全部事务,而且报异常。

    2.外部起事务,内部起事务,内部没有Try Catch

    内部出错:如果内部事务出错,内部和外部事物全部回滚,外部回滚之前的操作全部不存在,但是之后的操作继续执行。

    外部出错:如果内部事务出错,内部和外部事物全部回滚,外部回滚之前的操作全部不存在,但是之后的操作继续执行。

    3.外部起事务,内部不起事务,但有Try Catch。

    内部出错:外部事物正常提交,外部事物不会进入ROLLBACK,内部出错之后的记录也会正常执行。内部操作中,Try部分在错误出现之前的操作正常,Try部分在操作之后的操作不执行,然后进入Catch块中执行操作。

    外部出错:内部和外部事物全部回滚,外部回滚之前的操作全部不存在,但是之后的操作继续执行。

    4.外部起事务,内部不起事务,但没有Try Catch.

    内部出错:如果内部事务出错,内部和外部事物全部回滚,外部回滚之前的操作全部不存在,但是之后的操作继续执行。

    外部出错:如果内部事务出错,内部和外部事物全部回滚,外部回滚之前的操作全部不存在,但是之后的操作继续执行。

    5.外部不起事务,内部起事务,但有Try Catch.

    内部出错:外部操作被正常执行,内部ROLLBACK操作前全部回滚,之后的操作正常执行。

    外部出错:出错操作之前的操作不会回滚,出错之后的操作不执行,跳入Catch块中,内部事务不会回滚。

    6.外部不起事务,内部起事务,但没有Try Catch.

    内部出错:外部操作被正常执行,内部ROLLBACK操作前全部回滚。由于没有catch块,所以外部操作全部执行。

    外部出错:内部事务正常提交,外部只有当条记录失败,其他操作正常执行,但是有严重错误报出来。

    对于事务保存点

    事务保存点只有SAVE和ROLLBACK操作,当外部调用内部保存点,内部出现问题不影响外部事务,外部操作正常执行。当外部操作出现问题时,内部所有操作都回滚掉。

    如:外部起事务,内部起保存点,内外都有Try Catch

    内部出错:外部操作正常,不进入Catch,内部事务回滚到保存点,之后的继续执行。

    外部出错:如果外部事物在保存点之前出现异常,那么外部和内部所有操作回滚。如果外部事物在保存点之前出现异常,由于保存点已经提交了事务,导致外部rollback找不到对应的事务点。

    事务的嵌套

    PRINT 'Trancount before transaction: ' + CAST(@@TRANCOUNT as char(1))

    BEGIN TRAN

    PRINT 'After first BEGIN TRAN: ' + CAST(@@TRANCOUNT as char(1))

    BEGIN TRAN

    PRINT 'After second BEGIN TRAN: ' + CAST(@@TRANCOUNT as char(1))

    COMMIT TRAN

    PRINT 'After first COMMIT TRAN: ' + CAST(@@TRANCOUNT as char(1))

    COMMIT TRAN

    PRINT 'After second COMMIT TRAN: ' + CAST(@@TRANCOUNT as char(1))

    在结果中,可以看到每一个BEGIN TRAN 语句都会使@@TRANCOUNT增加1并且每一个COMMIT TRAN语句都会使其减少1。如前所述,一个值为0的@@TRANCOUNT意味着没有打开的事务。因此,在@@TRANCOUNT值从1降到0时结束的事务发生在外层事务提交的时候。因此,每一个内部事务都需要提交。由于事务起始于第一个BEGIN TRAN并结束于最后一个COMMIT TRAN,因此最外层的事务决定了是否完全提交内部的事务。如果最外层的事务没有被提交,其中嵌套的事务也不会被提交。

    键入并执行以下批来检验事务回滚时所发生的情况:

    BEGIN TRAN

    PRINT 'After 1st BEGIN TRAN: ' + CAST(@@TRANCOUNT as char(1))

    BEGIN TRAN

    PRINT 'After 2nd BEGIN TRAN: ' + CAST(@@TRANCOUNT as char(1))

    BEGIN TRAN

    PRINT 'After 3rd BEGIN TRAN: ' + CAST(@@TRANCOUNT as char(1))

    UPDATE Data1

    SET value1 = 1000000

    WHERE Id = 1

    COMMIT TRAN

    PRINT 'After first COMMIT TRAN: ' + CAST(@@TRANCOUNT as char(1))

    ROLLBACK TRAN

    PRINT 'After ROLLBACK TRAN: ' + CAST(@@TRANCOUNT as char(1))

    SELECT * FROM Data1

    WHERE Id = 1;

    在这个示例中,数据表Data1在一个嵌套事务中被更新,这会被立即提交。然后ROLLBACK TRAN被执行。ROLLBACK TRAN将@@TRANCOUNT减为0并回滚整个事务及其中嵌套的事务,无论它们是否已经被提交。因此,嵌套事务中所做的更新被回滚,数据没有任何改变。

    始终牢记,在嵌套的事务中,只有最外层的事务决定着是否提交内部事务。每一个COMMIT TRAN语句总是应用于最后一个执行的BEGIN TRAN。因此,对于每一个COMMIT TRAN,必须调用一个COMMIT TRAN来提交事务。ROLLBACK TRAN语句总是属于最外层的事务,并且因此总是回滚整个事务而不论其中打开了多少嵌套事务。正因为此,管理嵌套事务很复杂。如果每一个嵌套存储过程都在自身中开始一个事务,那么嵌套事务大部分会发生在嵌套存储过程中。要避免嵌套事务,可以在过程开始处检查@@TRANCOUNT的值,以此来确定是否需要开始一个事务。如果@@TRANCOUNT大于0,因为过程已经处于一个事务中并且调用实例可以在错误发生时回滚事务。

    存储过程和触发器中回滚  如果 @@TRANCOUNT 的值在存储过程完成时与过程执行时不同,则会生成一个 266 信息类错误。该错误不是由触发器中同一个条件生成的。

    当调用存储过程时,如果 @@TRANCOUNT 为 1 或更大,并且该过程执行 ROLLBACK TRANSACTION 或 ROLLBACK WORK 语句,则会产生 266 号错误。这是因为 ROLLBACK 回滚所有未完成的事务,并将 @@TRANCOUNT 减到 0,该值比调用过程时要小。

    如果在触发器中发出 ROLLBACK TRANSACTION:

    对当前事务中的那一点所做的所有数据修改都将回滚,包括触发器所做的修改。

    触发器继续执行 ROLLBACK 语句之后的所有其余语句。如果这些语句中的任意语句修改数据,则不回滚这些修改。执行其余的语句不会激发嵌套触发器。

    在批处理中,所有位于激发触发器的语句之后的语句都不被执行。

    触发器中的 ROLLBACK 关闭并释放所有在包含激发触发器的语句的批处理中声明和打开的游标。这其中包括了在激发触发器的批处理所调用的存储过程中声明和打开的游标。在激发触发器 的批处理之前的批处理中所声明的游标将只是关闭,但是在以下条件下,STATIC 或 INSENSITIVE 游标不关闭:

    CURSOR_CLOSE_ON_COMMIT 设置为OFF。

    静态游标要么是同步游标,要么是完全填充的异步游标。

    当执行触发器时,触发器的操作总是好像有一个未完成的事务在起作用。如果激发触发器的语句是在隐性或显式事务中,则肯定会这样。在自动提交模式下,也是 如此。当语句开始以自动提交模式执行时,如果遇到错误,则会有隐含的 BEGIN TRANSACTION 语句允许恢复该语句生成的所有修改。该隐含的事务对批处理中的其它语句没有影响,因为当语句完成时,该事务要么提交,要么回滚。但是,当调用触发器时,该 隐含的事务将仍然有效。

    这意味着,只要触发器中发出 BEGIN TRANSACTION 语句,则实际上就开始了一个嵌套事务。因为当回滚嵌套事务时,嵌套的 BEGIN TRANSACTION 语句将被忽略,触发器中发出的 ROLLBACK TRANSACTION 总是回滚过去该触发器本身发出的所有 BEGIN TRANSACTION 语句。ROLLBACK 回滚到最外部的 BEGIN TRANSACTION。

    若要在触发器中进行部分回滚,则即使总是以自动提交模式进行调用,也必须使用 SAVE TRANSACTION 语句。以下的触发器阐明了这一点:

    CREATE TRIGGER TestTrig ON TestTab FOR UPDATE AS

    SAVE TRANSACTION MyName

    INSERT INTO TestAudit

    SELECT * FROM inserted

    <

    >

    0)

    BEGIN

    ROLLBACK TRANSACTION MyName

    END

    这也影响触发器中 BEGIN TRANSACTION 语句后面的COMMIT TRANSACTION 语句。因为 BEGIN TRANSACTION 启动一个嵌套事务,而随后的 COMMIT 语句只应用于该嵌套事务。如果在 COMMIT 之后执行 ROLLBACK TRANSACTION 语句,那么 ROLLBACK 将一直回滚到最外部的 BEGIN TRANSACTION。以下的触发器阐明了这一点:

    CREATE TRIGGER TestTrig ON TestTab FOR UPDATE AS

    BEGIN TRANSACTION

    INSERT INTO TrigTarget

    SELECT * FROM inserted

    COMMIT TRANSACTION

    ROLLBACK TRANSACTION

    此触发器绝对不会在 TrigTarget 表中插入。BEGIN TRANSACTION 总是启动一个嵌套事务。COMMIT TRANSACTION 只提交嵌套事务,而下面的 ROLLBACK TRANSACTION 则一直回滚到最外部的 BEGIN TRANSACTION。

    展开全文
  • 事务回滚机制

    2020-05-10 20:42:38
    一、事务管理的意义: 在service类或所有service方法都加上事务操作;用来保证一致性,即service方法里的多个dao操作,要么同时成功,要么同时失败,保证了事务的原子性 二、springboot配置事务管理的步骤 1、...

    SpringBoot提供了非常方便的事务操作,通过注解就可以实现事务的回滚,下面我们就说一下如何进行事务操作

    1. 事务说明

    在Spring中,事务有两种实现方式,分别是编程式事务管理和声明式事务管理两种方式。
    编程式事务管理: 编程式事务管理使用TransactionTemplate或者直接使用底层的PlatformTransactionManager。对于编程式事务管理,spring推荐使用TransactionTemplate。
    声明式事务管理: 建立在AOP之上的。其本质是对方法前后进行拦截,然后在目标方法开始之前创建或者加入一个事务,在执行完目标方法之后根据执行情况提交或者回滚事务。
    声明式事务管理不需要入侵代码,通过@Transactional就可以进行事务操作,更快捷而且简单。推荐使用

    2. 如何使用

    在Mybatis中使用事务非常简单,只需要在函数增加注解@Transactional,无需任何配置。我们通过在controller层增加事务例子看下:

    @Autowired
    OrderServiceorderService;   //order操作的Service层
    
    @ApiOperation(value = "增加OrderCustomer")
    @RequestMapping(value = "", method = RequestMethod.POST)
    @ResponseBody
    @Transactional
    public JsonBean<Order> insertOrder(@RequestParam(value = "order") String order) {
        try {
            //创建订单
            Order order = orderService.insert(user.getId(),is_company,fk_want_company_id);
            return new JsonBean(SUCCESS, orderCustomer);
        } 
        catch (ErrorCodeException e)
        {
            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
            return new JsonBean(e.getErrorCode());
        }
    }

    @Transactional可以作用于接口、接口方法、类以及类方法上。当作用于类上时,该类的所有 public 方法将都具有该类型的事务属性,同时,我们也可以在方法级别使用该标注来覆盖类级别的定义。因此可以在Service层和Controller层使用,上述例子我们在Controller层实现,我们模拟了一个订单提交的接口,其中JsonBean是统一返回错误码基类,ErrorCodeException是自定义异常。

    1. 通过@Transactional,实现了事务操作。
    2. Spring的AOP即声明式事务管理默认是针对unchecked exception回滚。也就是默认对RuntimeException()异常或是其子类进行事务回滚;checked异常,即Exception可try{}捕获的不会回滚,因此如果不捕获的异常,而是抛出异常,可通过rollbackFor进行设定,后续会单独讲
    3. 如果我们需要捕获异常后,同时进行回滚,通过TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();进行手动回滚操作。
    4. 使用Object savePoint = TransactionAspectSupport.currentTransactionStatus().createSavepoint();
      设置回滚点,使用TransactionAspectSupport.currentTransactionStatus().rollbackToSavepoint(savePoint);回滚到savePoint。

    3、解决Transactional注解不回滚

    1、检查你方法是不是public的,@Transactional 注解只能应用到 public 可见度的方法上。 如果应用在protected、private或者 package可见度的方法上,也不会报错,不过事务设置不会起作用。

    2、你的异常类型是不是unchecked异常,如果我想check异常也想回滚怎么办,注解上面写明异常类型即可

    @Transactional(rollbackFor=Exception.class) 

    类似的还有norollbackFor,自定义不回滚的异常

    3、数据库引擎要支持事务,如果是MySQL,注意表要使用支持事务的引擎,比如innodb,如果是myisam,事务是不起作用的

    4、是否开启了对注解的解析

        <tx:annotation-driven transaction-manager="transactionManager" proxy-target-class="true"/>
    

    5、spring是否扫描到你这个包,如下是扫描到org.test下面的包

    <context:component-scan base-package="org.test" ></context:component-scan>

    6、检查是不是同一个类中的方法调用(如a方法调用同一个类中的b方法)
    7、异常是不是被你catch住了,如果捕获了,则需要手动回滚

    TransactionAspectSupport.currentTransactionStatus().setRollbackOnly()

    4、常用配置

    参 数 名 称功 能 描 述
    readOnly该属性用于设置当前事务是否为只读事务,设置为true表示只读,false则表示可读写,默认值为false。例如:@Transactional(readOnly=true)
    rollbackFor该属性用于设置需要进行回滚的异常类数组,当方法中抛出指定异常数组中的异常时,则进行事务回滚。例如:指定单一异常类:@Transactional(rollbackFor=RuntimeException.class)指定多个异常类:@Transactional(rollbackFor={RuntimeException.class, Exception.class})
    rollbackForClassName该属性用于设置需要进行回滚的异常类名称数组,当方法中抛出指定异常名称数组中的异常时,则进行事务回滚。例如:指定单一异常类名称@Transactional(rollbackForClassName=”RuntimeException”)指定多个异常类名称:@Transactional(rollbackForClassName={“RuntimeException”,”Exception”})
    noRollbackFor该属性用于设置不需要进行回滚的异常类数组,当方法中抛出指定异常数组中的异常时,不进行事务回滚。例如:指定单一异常类:@Transactional(noRollbackFor=RuntimeException.class)指定多个异常类:@Transactional(noRollbackFor={RuntimeException.class, Exception.class})
    noRollbackForClassName该属性用于设置不需要进行回滚的异常类名称数组,当方法中抛出指定异常名称数组中的异常时,不进行事务回滚。例如:指定单一异常类名称:@Transactional(noRollbackForClassName=”RuntimeException”)指定多个异常类名称:@Transactional(noRollbackForClassName={“RuntimeException”,”Exception”})
    propagation该属性用于设置事务的传播行为。例如:@Transactional(propagation=Propagation.NOT_SUPPORTED,readOnly=true)
    isolation该属性用于设置底层数据库的事务隔离级别,事务隔离级别用于处理多事务并发的情况,通常使用数据库的默认隔离级别即可,基本不需要进行设置
    timeout该属性用于设置事务的超时秒数,默认值为-1表示永不超时

    5、事务属性

    事务隔离级别
    隔离级别是指若干个并发的事务之间的隔离程度。TransactionDefinition 接口中定义了五个表示隔离级别的常量:

    TransactionDefinition.ISOLATION_DEFAULT:这是默认值,表示使用底层数据库的默认隔离级别。对大部分数据库而言,通常这值就是TransactionDefinition.ISOLATION_READ_COMMITTED。
    TransactionDefinition.ISOLATION_READ_UNCOMMITTED:该隔离级别表示一个事务可以读取另一个事务修改但还没有提交的数据。该级别不能防止脏读,不可重复读和幻读,因此很少使用该隔离级别。比如PostgreSQL实际上并没有此级别。
    TransactionDefinition.ISOLATION_READ_COMMITTED:该隔离级别表示一个事务只能读取另一个事务已经提交的数据。该级别可以防止脏读,这也是大多数情况下的推荐值。
    TransactionDefinition.ISOLATION_REPEATABLE_READ:该隔离级别表示一个事务在整个过程中可以多次重复执行某个查询,并且每次返回的记录都相同。该级别可以防止脏读和不可重复读。
    TransactionDefinition.ISOLATION_SERIALIZABLE:所有的事务依次逐个执行,这样事务之间就完全不可能产生干扰,也就是说,该级别可以防止脏读、不可重复读以及幻读。但是这将严重影响程序的性能。通常情况下也不会用到该级别。

    事务传播行为
    所谓事务的传播行为是指,如果在开始当前事务之前,一个事务上下文已经存在,此时有若干选项可以指定一个事务性方法的执行行为。在TransactionDefinition定义中包括了如下几个表示传播行为的常量:

    TransactionDefinition.PROPAGATION_REQUIRED:如果当前存在事务,则加入该事务;如果当前没有事务,则创建一个新的事务。这是默认值。
    TransactionDefinition.PROPAGATION_REQUIRES_NEW:创建一个新的事务,如果当前存在事务,则把当前事务挂起。
    TransactionDefinition.PROPAGATION_SUPPORTS:如果当前存在事务,则加入该事务;如果当前没有事务,则以非事务的方式继续运行。
    TransactionDefinition.PROPAGATION_NOT_SUPPORTED:以非事务方式运行,如果当前存在事务,则把当前事务挂起。
    TransactionDefinition.PROPAGATION_NEVER:以非事务方式运行,如果当前存在事务,则抛出异常。
    TransactionDefinition.PROPAGATION_MANDATORY:如果当前存在事务,则加入该事务;如果当前没有事务,则抛出异常。
    TransactionDefinition.PROPAGATION_NESTED:如果当前存在事务,则创建一个事务作为当前事务的嵌套事务来运行;如果当前没有事务,则该取值等价于TransactionDefinition.PROPAGATION_REQUIRED。

    事务超时
    所谓事务超时,就是指一个事务所允许执行的最长时间,如果超过该时间限制但事务还没有完成,则自动回滚事务。在 TransactionDefinition 中以 int 的值来表示超时时间,其单位是秒。
    默认设置为底层事务系统的超时值,如果底层数据库事务系统没有设置超时值,那么就是none,没有超时限制。

    事务只读属性
    只读事务用于客户代码只读但不修改数据的情形,只读事务用于特定情景下的优化,比如使用Hibernate的时候。
    默认为读写事务。

    展开全文
  • Spring中事务分为编程时事务和声明式事务,编程式事务:编程人员通过代码控制事务的开启、回滚、提交,声明式事务:把事务的处理交给spring。使用注解@transactional配置就是声明式事务。基本配置在...
  • 本篇文章主要给大家介绍mysql事务提交及事务回滚的相关知识。事务可以说是一段sql 语句的批处理,但是这个批处理是一个atom(原子) ,不可分割,要么都提交执行,要么回滚(rollback)都不执行。关于事务的详细定义介绍...
  • Redis的基础事务及事务回滚

    千次阅读 2019-11-07 18:56:39
    1 Redis的基础事务及常用操作 和其他大部分的 NoSQL 不同,Redis 是存在事务的,尽管它没有数据库那么强大,但是它还是很有用的,尤其是在那些需要高并发的网站当中。 使用 Redis 读/写数据要比数据库快得多,如果...
  • JDBC事务回滚

    2019-08-04 12:23:54
    JDBC事务回滚 这个案例使用的是mysql数据库 事务的回滚主要是用在增删改里面 由于事务回滚操作自能回滚同一连接内的数据 在jdbc的使用是一样的,唯一不同的是必须使用同一个连接 所有在这里使用ThreadLocal容器去...
  • 一.什么是事务事务是应用程序中一系列严密的操作,所有操作必须成功...如果其中一个步骤失败,将发生回滚操作,撤消撤消之前到事务开始时的所以操作。二.事务的 ACID事务具有四个特征:原子性( Atomicity )、一致...
  • Springboot添加事务回滚

    千次阅读 2021-01-13 11:36:52
    Springboot添加事务回滚 在java开发中经常会遇到这种类似这种情况,批量插入数据的时候,有一条除了问题导致程序终止但是之前的都已经插入。对于已经出了问题的程序。之前插入的数据难保其正确性,所以当出了问题...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 292,088
精华内容 116,835
关键字:

事务回滚

友情链接: tlrdl74.zip