什么是事务?
把一组业务当成一个业务来做;要么都成功,要么都失败,保证业务操作完整性的一种数据库机制。
Spring JdbcTemplate配置并测试数据源
连接数据库的配置文件
xml配置 注意:spring容器提供了一个JdbcTemplate类,用来方便操作数据库。 可以在xml配置文件里面加上,将其注册为bean组件
使用JdbcTemplate对数据库进行基本的增删改查
测试DruidDatasource有没有连接上 增删改查
声明式事务
ACID 四大特性 A 原子性:原子性指的是 在一组业务操作下 要么都成功 要么都失败 在一组增删改查的业务下 要么都提交 要么都回滚 C 一致性:事务前后的数据要保证数据的一致性 在一组的查询业务下 必须要保证前后关联数据的一致性 I 隔离性:在并发情况下 事物之间要相互隔离。 D 持久性:数据一旦保存就是持久性的 声明式事务:在方法的外部添加注解或者直接在配置文件中定义,将事务管理代码从业务方法中分离出来,以声明的方式来实现事务管理。spring的AOP恰好可以完成此功能:事务管理代码的固定模式作为一种横切关注点,通过AOP方法模块化,进而实现声明式事务。
注意:
@Transactional注解应该写在哪: @Transactional 可以标记在类上面(当前类所有的方法都运用上了事务) @Transactional 标记在方法则只是当前方法运用事务 也可以类和方法上面同时都存在, 如果类和方法都存在@Transactional会以方法的为准。 如果方法上面没有@Transactional会以类上面的为准 建议:@Transactional写在方法上面,控制粒度更细, 建议@Transactional写在业务逻辑层上,因为只有业务逻辑层才会有嵌套调用的情况
设置隔离级别(isolation)
用来解决并发事务所产生一些问题: 并发: 同一个时间,多个线程同时进行请求。 什么时候会生成并发问题:在并发情况下,对同一个数据(变量、对象)进行读写操作才会产生并发问题 并发会产生什么问题? 1.脏读 2.不可重复度 3.幻影读 解决方法: 一 脏读
- 一个事务,读取了另一个事务中没有提交的数据,会在本事务中产生的数据不一致的问题
解决方式:@Transactional(isolation = Isolation.READ_COMMITTED) 二 不可重复读 2.一个事务中,多次读取相同的数据, 但是读取的结果不一样, 会在本事务中产生数据不一致的问题。 解决方式:@Transactional(isolation = Isolation.REPEATABLE_READ) 三 幻读 一个事务中,多次对数据进行整表数据读取(统计),但是结果不一样, 会在本事务中产生数据不一致的问题。 解决方式:@Transactional(isolation = Isolation.SERIALIZABLE) 很多人容易搞混不可重复读和幻读,确实这两者有些相似: 对于前者, 只需要锁行 对于后者, 需要锁表
spring事务的传播行为:
超时属性(timeout)
注意:一般基于注解来实现事务的话,在方法上加上 @Transactional注解就行,如果需要加什么属性,再额外加上即可
基于xml的事务配置
注意:xml的事务配置可以和注解的事务配置同时使用,如果同时使用,注解的优先级更高
|