DEFAULT:采用 DB 默认的事务隔离级别。MySql 的默认为 REPEATABLE_READ; Oracle默认为 READ_COMMITTED。
➢ READ_UNCOMMITTED:读未提交。未解决任何并发问题。
➢ READ_COMMITTED:读已提交。解决脏读,存在不可重复读与幻读。
➢ REPEATABLE_READ:可重复读。解决脏读、不可重复读,存在幻读
➢ SERIALIZABLE:串行化。不存在并发问题。
控制业务方法是不是有事务的, 是什么样的事务的。
7个传播行为,表示你的业务方法调用时,事务在方法之间是如果使用的。
PROPAGATION_REQUIRED
PROPAGATION_REQUIRES_NEW
PROPAGATION_SUPPORTS
以上三个需要掌握的
PROPAGATION_MANDATORY
PROPAGATION_NESTED
PROPAGATION_NEVER
PROPAGATION_NOT_SUPPORTED
spring框架自己用aop实现给业务方法增加事务的功能, 使用@Transactional注解增加事务。@Transactional注解是spring框架自己注解,放在public方法的上面,表示当前方法具有事务。可以给注解的属性赋值,表示具体的隔离级别,传播行为,异常信息等等
<bean id=“xxx" class="...DataSourceTransactionManager">
<!--使用spring的事务处理-->
<!--声明事务管理器-->
<bean class="org.springframework.jdbc.support.JdbcTransactionManager" id="transactionManager">
<!--连接的数据库,指定数据源-->
<property name="dataSource" ref="dataSource"></property>
</bean>
<!--开启事务注解驱动,告诉spring使用注解管理对象-->
<tx:annotation-driven transaction-manager="transactionManager"></tx:annotation-driven>
public interface DeptService {
public void testTran();
}
@Service
@Transactional
//添加事务
public class DeptServiceImpl implements DeptService {
@Override
public void testTran() {
Dept d1 = new Dept("测试事务", "测试");
deptDao.save(d1);
Dept d2 = new Dept(1, "ces", "ces");
deptDao.save2(d2);
}
}
<!--声明业务方法它的事务属性(隔离级别,传播行为,超市时间)
id:自定义名称transaction-manager,表示tx:advice和</tx:advice>之间的配置内容
transaction-manager:代表事务管理器对象的id
-->
<tx:advice id="myadvice" transaction-manager="transactionManager">
<!---->
<!--tx:attributes:配置事务属性-->
<tx:attributes>
<!--tx:method:给具体的方法配置事务属性,method可以有多个,
分别给不同的方法设置事务属性
name:方法名称:1)完整的方法名称,不带有包和类
2)方法可以使用通配符,*表示任意字符
propagation:传播行为,枚举值
isolation:隔离级别
rollback-for:指定的异常类名,全限定类名,发生异常一定回滚 -->
<tx:method name="buy" propagation="REQUIRED" isolation="DEFAULT"
rollback-for=" java.lang.NullPointerException,com.openlab.excep.NotEnoughException" />
<!--通过通配符,指定很多的方法-->
<tx:method name="add" propagation="REQUIRES_NEW"></tx:method>
<!--指定修改方法-->
<tx:method name="modif"></tx:method>
</tx:attributes>
</tx:advice>
<!--配置aop-->
<aop:config>
<!--配置切入点表达式:指定那些包中的类要应用事务
id切入点表达式的名称唯一值
expression;切入点表达式指定那些类要使用事务,aspectj会创建代理对象
-->
<aop:pointcut id="point" expression="execution(* com.openlab.service.BuyGoodsService.*(..))"/>
<!-- 配置增强器:关联advice和pointcut
advice-ref:通知,上面tx:advice的配置
-->
<aop:advisor advice-ref="myadvice" pointcut-ref="point"></aop:advisor>
</aop:config>
1.配置pom文件加入依赖
2.创建实体类
3.创建dao接口和mapper文件
int insertuser(Users user);
List<Users> selectAll();
<mapper namespace="com.openlab.dao.UserDao">
<insert id="insertuser">
insert into user values (#{id},#{name },#{password})
</insert>
<select id="selectAll" resultType="com.openlab.pojo.Users">
select * from user
</select>
</mapper>
4.创建mybatis主配置文件
<typeAliases>
<package name="com.openlab.pojo"/>
</typeAliases>
<mappers>
<package name="com.openlab.dao"/>
</mappers>
5.创建service接口和实现类,属性是dao
int add(Users user);
List<Users> quseryUser();
//引用类型
private UserDao dao;
@Override
public int add(Users user) {
int nums= dao.insertuser(user);
return nums;
}
@Override
public List<Users> quseryUser() {
List<Users> list=dao.selectAll();
return list;
}
6.创建spring配置文件,声明mybatis的对象交给spring创建
<context:property-placeholder location="classpath:db.properties"></context:property-placeholder>
<!---->
<!--声明数据源datesource,作用连接数据库-->
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
<property name="driverClassName" value="${jdbc.driverClassName}"></property>
<property name="url" value="${jdbc.url}"></property>
<property name="username" value="${jdbc.username}"></property>
<property name="password" value="${jdbc.password}"></property>
</bean>
<!--声明的是mybatis中提供的sqlsessionfactory类。这个类内部创建sqlsessionfactory-->
<bean class="org.mybatis.spring.SqlSessionFactoryBean" id="sqlSessionFactory">
<!--set注入,把数据库连接池付给datesource属性-->
<property name="dataSource" ref="dataSource"></property>
<!--mybatis主配置文件的位置
configLocation:属性resource类型,读取配置文件的
他的赋值,使用value,指定文件路径,使用calsspath:表示文件的位置
-->
<property name="configLocation" value="classpath:mybatis.xml"></property>
</bean>
<!--创建dao对象,使sqlsession的getmapper(user.class)
MapperScannerConfigurer:在内部第调用getmapper()生成每个dao接口的代理对象
-->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<!--指定sqlsessionfactory对象的id-->
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"></property>
<!--指定包名包名使接口所在的包名
MapperScannerConfigurer会扫描这个包中的所有接口,把每个接口都执行一次
getmapper()方法,得到每个接口的到对象
创建好的dao对象放入到spring的容器中
-->
<property name="basePackage" value="com.openlab.dao"></property>
</bean>
7.测试
<!--声明service--><bean id="userservice" class="com.openlab.service.impl.Userviceimpl"> <property name="dao" ref="userDao"></property></bean>
ApplicationContext ac=new ClassPathXmlApplicationContext("beans.xml");
Userviceimpl u = ac.getBean(Userviceimpl.class);
List<Users> users = u.selectAll();
for(Users u:users){
System.out.println(u);
}