事务
1、什么是事务
事务是数据库操作最基本单元,逻辑上一组操作,要么都成功,如果有一个失败所有操作都失败
2.事务的四个特性(ACID)
(1)原子性
不可分割,一个事务就是一个最小的无法分割的独立单元,不允许部分成功部分失败
(2)一致性
保证事务前后的数据完整性保持一致
(3)隔离性
一个事务的执行不能被其他事务干扰
(4)持久性
事务一旦提交则不可逆,他对数据库中数据的改变是永久性的
Spring中的声明式事务管理: transcation
1)配置信息中引入事务的命名空间
xmlns:tx="http://www.springframework.org/schema/tx"
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd
2)启用事务:用注解驱动的方式来管理事务
<tx:annotation-driven/>
3)在 spring.xml 中配置事务管理器 : id=" transcationManager "
<!-- 5)配置事务管理器
id="transactionManager" id名必须是transactionManager,不能更改
-->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
- 在要使用事务的方法或类上,添加注解 @Transcational,spring会自动提交,回滚事务
/**
事务注解(@Transactional):
加在方法上,表示此方法受事务管理(自动提交,回滚事务)
加在类上,那么这个类中的所有方法都受事务管理
最后要注意的是,在业务方法中不要自己try-catch捕获异常,否则spring无法自动回滚事务
*/
@Transactional
public void business1(){
productMapper.delete(100000005);
productMapper.delete(100000006);
int i = 1/0;
productMapper.delete(100000007);
}
@Transcational 的工作原理:
认情况下,数据库处于自动提交模式,每一条语句处于一个单独的事务中,在这条语句执行完毕时,如果执行成功则隐式的提交事务,如果执行失败则隐式的回滚事务。
事务管理,是一组相关的操作处于一个事务之中,因此必须关闭数据库的自动提交模式。这点,Spring会在org/springframework/jdbc/datasource/DataSourceTransactionManager.java中将底层连接的自动提交特性设置为false
注解 @Transcational:
1、 @Transcational 默认情况下,只有方法出现的 是RuntimeException或Error以及它们的子类时(未检查异常),才会导致事务回滚 如果要改变默认情况
@Transactional(rollbackFor=异常类.class)
那么方法如果出现了该异常,或该异常的子类异常时,就会回滚 @Transactional(noRollbackFor=异常类.class)
当遇到这种异常时,不会回滚事务
注意:在业务方法中不要自己try-catch捕获异常,否则spring无法自动回滚事务
2、@Transactional(readOnly = true|false) :true表示只读(只有查询) false(会有增删改)
设置为true,性能会有所提升,但是底层数据库驱动支持(对mysql支持)
3、事务超时设置:
@Transactional(timeout=30) //默认是30秒
4、 事务的传播行为: @Transcational (propagation=传播行为)
只有两个业务类的方法相互调用时,传播行为才会有效
ProductService 商品业务类
@Transactional(propagation=REQUIRED)
biz1() { // 事务1
biz2();
}
OrderService 订单业务类
@Transactional(propagation=REQUIRES_NEW)
biz2(); // 事务2
Spring和Mybatis整合:
方法一: 通过 XXXMapper.xml 映射文件整合
1)配置 pom.xml 文件,加入所需要的依赖
<dependencies>
<!-- spring jar 包-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.3.18.RELEASE</version>
</dependency>
<!-- junit jar 包-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
<!-- mysql 的驱动包-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.12</version>
</dependency>
<!--logback 日志包-->
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.2.3</version>
</dependency>
<!-- mybatis jar 包-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.5</version>
</dependency>
<!-- 数据库连接池 alibaba 的 druid -->