0%

事务

事务

事物

介绍

四个特性

原子性:不可分割

一致性:一致性是指事务必须使数据库从一个一致性状态变换到另一个一致性状态

隔离性:不被其他事物影响

持久性:对数据库的改变是持久的。

事务并发时会出现的问题

脏读:一个事务读取到另一个事务未提交的数据。

不可重复读:是指一个事务范围内,多次查询某个数据,却得到不同的结果。第一个事务中的两次读取数据之间,第二个事务对数据进行了修改。

幻读:第一个事务对一个表中全部数据行中的某一项的数据进行了修改。同时,第二个事务向表中插入一行新数据。那么,以后就会发生操作第一个事务的用户发现表中还有没有修改的数据行。

隔离级别

Read uncommitted(读未提交):任何情况都无法保证。

Read committed(读已提交):可避免脏读。oracle采用。

Repeatable read(可重复读):可避免脏读、不可重复读。mysql采用

Serializable(串行化):可避免脏读、不可重复读、幻读的发生。

实现原理

给格数据源提供开启事务、释放资源、回滚数据等接口,各数据源负责具体实现。比如:jdbc,mybatis,hibernate。自己的框架需要自己实现。

底层使用SpringAop,而不是SpringAop+Aspectj

具体使用

xml使用

配置事务+数据源

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<!-- 配置事务管理器 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"></property>
</bean>

<!-- 配置数据源 -->
<bean id="dataSource"
class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName"
value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql:///kkb" />
<property name="username" value="root" />
<property name="password" value="root" />
</bean>

<!-- 扫描AccountDao和AccountService -->
<context:component-scan base-package="com.kkb.spring.tx"></context:component-scan>

配置通配符方法

1
2
3
4
5
6
7
8
9
10
11
<!-- 配置事务通知类(Spring实现的事务增强类) -->
<!-- TransactionInterceptor -->
<tx:advice id="txAdvice"
transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="save*" propagation="REQUIRED" />
<tx:method name="update*" propagation="REQUIRED" />
<tx:method name="transfer*" propagation="REQUIRED" />
<tx:method name="query*" read-only="true" />
</tx:attributes>
</tx:advice>

配置切面

1
2
3
4
5
6
7
<!-- 配置aop切面类或者通知器类 -->
<aop:config>
<!-- 这使用的是Spring AOP的实现 -->
<!-- advice-ref:指定advice增强类 -->
<aop:advisor advice-ref="txAdvice"
pointcut="execution(* *..*.*ServiceImpl.*(..))" />
</aop:config>

xml+注解混合使用

通配符方法+切面改为注解@Transactional

1
2
3
4
5
@Service
@Transactional
public class UserServiceImpl implements UserService{

}
1
2
<!-- 配置事务注解驱动 -->
<tx:annotation-driven transaction-manager="transactionManager"/>

纯注解使用

xml配置改为注解@EnableTransactionManagement

1
@EnableTransactionManagement