Spring事务入门

Spring事务管理

Spring事务分为两种:

  • 声明式事务(通过配置或注解使用,通过AOP实现)
  • 编程式事务(通过代码的方式实现)

声明式事务

使用 @Transactional注解进行事务管理。

注意点:

  1. 引入Spring的@Transactional注解。不要引入其他包里的。
  2. 要在public方法上,除非特殊配置,(如使用AspectJ静态织入实现AOP)。因为Spring动态代理默认是AOP,对目标方法进行增强,不能代理到private方法。
  3. 必须通过代理过的类从外部调用目标方法才能生效。Spring通过AOP对方法进行增强,所以要调用增强的方法必须是调用代理后的对象。
  4. 异常抛出了标记@Transactional注解的方法,事务才能回滚。
  5. 默认情况下,出现RuntimeException或Error的时候才会回滚。

编程式事务

几个重要接口:

  • PlatformTransactionManager: (平台)事务管理器,Spring 事务策略的核心。具体实现交给不同的持久化框架来完成。spring-boot-starter-jdbc默认注入DataSourceTransactionManagerspring-boot-starter-data-jpa默认注入JpaTransactionManager,Hibernate默认注入HibernateTransactionManager
  • TransactionDefinition: 事务定义信息(事务隔离级别、传播行为、超时、只读、回滚规则)。
  • TransactionStatus: 事务运行状态。

查看具体的事务管理器

@EnableTransactionManagement // 启注解事务管理
@SpringBootApplication
public class ProfiledemoApplication {

    @Bean
    public Object testBean(PlatformTransactionManager platformTransactionManager){
        System.out.println(">>>>>>>>>>" + platformTransactionManager.getClass().getName());
        return new Object();
    }

    public static void main(String[] args) {
        SpringApplication.run(ProfiledemoApplication.class, args);
    }
}

编程式事务

/**
 * 
 * @param dataSource 要执行这个sql的数据源
 */
public void demo(DataSource dataSource) {
    // 当前具体的事务管理器
    PlatformTransactionManager transactionManager = new DataSourceTransactionManager(dataSource);
    DefaultTransactionDefinition def = new DefaultTransactionDefinition();//事务定义类
    def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);
    TransactionStatus status = transactionManager.getTransaction(def);// 返回事务状态对象
    try {
        /*
               ...... 执行sql
             */
        transactionManager.commit(status);
    } catch (Exception e) {
        transactionManager.rollback(status);
    }
}

2021年8月30日

补充:

spring 声明式事务+MySQL数据库执行DDL语句后不能回滚。

原因:

  • MySQL默认是开启autocommit的,即每一条DML语句都会被作为一个单独的事务进行隐式提交。
  • 如果使用begin或start transaction显式开启一个事务,则需要显示的commit或rollback来结束事务。
  • 一个事务内执行DDL会触发隐式提交

优先级:

spring事务管理默认自动提交为false,jdbc为true,一般连接池是true(oracle),MySQL和Oracle默认是true。

一般优先级是:手动设置覆盖默认设置,即spring或者是druid可以覆盖MySQL配置的autocommit。

对于spring和druid来说,后设置的会覆盖前面设置的。

执行完DDL语句之后会直接commit DDL和之前的语句,所以rollback只能回滚到执行DDL语句后。即使将autocommit为false,依然无法回滚。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,634评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,951评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,427评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,770评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,835评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,799评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,768评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,544评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,979评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,271评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,427评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,121评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,756评论 3 324
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,375评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,579评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,410评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,315评论 2 352

推荐阅读更多精彩内容