Spring JDBC与事务管理 学习笔记

Spring JDBC

一.基本用法
1.1 添加依赖

      <dependency>
          <groupId>org.springframework</groupId>
          <artifactId>spring-jdbc</artifactId>
          <version>${spring.version}</version>
      </dependency>

      <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-tx</artifactId>
        <version>${spring.version}</version>
      </dependency>

1.2配置Dao
DataSource-->JdbcTemplate-->Dao-->Service-->Action

1.3配置DataSource
DataSource的实现方式:

  • 使用Spring提供的数据源(DriverManagerDataSource),没有连接池的功能,效率低
  • 使用第三方的数据源,如:dbcp,c3p0,druid(德鲁伊)
    <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
        <property name="driverClassName" value="${jdbc.driver}"/>
        <property name="url" value="${jdbc.url}"/>
        <property name="username" value="${jdbc.username}"/>
        <property name="password" value="${jdbc.password}"/>
    </bean>

二、用户注册
JDBC默认是自动提交数据的,每执行完一条sql语句就提交事务
解决:配置事务

Spring事务管理

一、两种方式
定义事务管理器,相当于事务的通知

    <!--配置事务管理器-->
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource"/>
    </bean>
  • 方式1:基于命名空间
    <!--定义通知,并指定事务管理器-->
    <tx:advice id="txAdvice" transaction-manager="transactionManager">
        <!--配置事务属性-->
        <tx:attributes>
            <tx:method name="login" propagation="SUPPORTS" read-only="true"/>
            <tx:method name="regist" propagation="REQUIRED" isolation="READ_COMMITTED" no-rollback-for="java.lang.ArithmeticException"
            timeout="5000" />
        </tx:attributes>
    </tx:advice>

    <aop:config>
        <!--配置切入点-->
        <aop:pointcut id="pc" expression="execution(* com.hxx.service.impl.*.*(..))"/>
        <!--进行织入-->
        <aop:advisor advice-ref="txAdvice" pointcut-ref="pc"/>
    </aop:config>
  • 方式2:基于注解
    @Transactional(propagation = Propagation.REQUIRED,rollbackFor = NullPointerException.class,
    timeout = 5000)
    <!--配置注解驱动-->
    <tx:annotation-driven transaction-manager="transactionManager"/>

二、事务属性

五个事务属性:

  • 传播属性
    propagation:定义事务的边界,用来定义当前方法是否需要事务。
    常用取值:

    • REQUIRED:必须添加事务,如果当前没有事务,则创建一个新的事务,一般用于增删改操作。
    • SUPPORTS:可以没有事务,如果当前有事务则运行,如果没有事务也可以运行,一般用于查询操作。
  • 隔离级别
    isolation:用来解决事务并发时会出现的一些问题。
    四种隔离级别:

    • TRANSACTION_READ_COMMITTED:已提交读——>可以避免脏读,但是可能发生不可重复读和幻读。
    • TRANSACTION_READ_UNCOMMITTED:未提交读——>可能会发生脏读,不可重复读和幻读。
    • TRANSACTION_REPEATABLE_READ:可重复读——>可避免脏读和不可重复读,但可能会发生幻读。
    • TRANSACTION_SERIALIZABLE:可序列化——>可以避免脏读,不可重复读和幻读,相当于单并发,没意义。

    事务并发时可能会出现的三个问题:

    • 脏读:一个事务读取到另一个事务没有提交的数据,一般不会发生,如MySql、Oracle底层默认只允许读取已经提交的数据。
    • 不可重复读:一个事务已经读取数据,另一个事务在修改数据,可能导致使用的数据与数据库中不同步。
    • 虚读或幻读:一个事务已经读取数据,另外一个事务在添加或删除数据,可能导致数据量与数据库不同步。
      注意:不可重复读和幻读是小概率事件,发生的几率比较低。可以通过版本检查来解决,如:Hibernate中的悲观锁和乐观锁就是通过版本检查来实现的,不但麻烦而且效率还低。实际开发中一般不需要配置隔离级别,大多是通过定时任务+人工审核。
  • 回滚条件
    rollback:默认抛出RuntimeException时才会回滚
    rollbackFor=""表示发生该异常时回滚
    norollbackFor=""表示发生该异常时不回滚

  • 只读优化
    readOnly:在该事务中只允许读取数据,一般用于查询

  • 超时处理
    timeout:配置事务的超时时间,一般不配置

三、事务特性
四个事务特性:ACID 原子性、一致性、隔离性、永久性

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

推荐阅读更多精彩内容

  • 一、事务 1、事务四要素:ACID 对于事务,我之前的理解是很粗糙的,不就是为了保证操作的原子性么?一般订单系统或...
    张伟科阅读 1,288评论 0 5
  • Spring 事务传播特性和隔离级别 事务是处理逻辑原子性的保证,作为单个逻辑单元执行一系列操作,要么执行完成要么...
    自负的鱼阅读 8,947评论 1 33
  • http://baijiahao.baidu.com/s?id=1581064626251873652&wfr=s...
    hekang01阅读 650评论 0 0
  • 1 有阴影陪伴我劳动,那表示我在明亮的阳光下。 《小感恩》 2 眼睛太靠近,我看不清自己。尼采《快乐的知识》 3 ...
    彧麇阅读 414评论 0 0
  • 近来不知为何,总不能平心静气的对待宇宝,他有一点不符合我心意的做法,我就会“大发雷霆”。不知从何时对他开始没有了耐...
    汝若安好阅读 145评论 0 0