1、事务传播行为
propagation
① REQUIRED(默认)
② REQUIRES_NEW
2、事务隔离级别
isolation
① Isolation.READ_UNCOMMITTED(会出现脏读,不可重复读,幻读 ,避免了 第一类丢失 更新)
② Isolation.READ_COMMITTED(会出现不可重复读,幻读)
③ Isolation.REPEATABLE_READ(会出现幻读)
④ Isolation.SERIALIZABLE
⑤ DEFAULT(默认,采用数据库默认隔离级别)
3、事务回滚属性(针对异常属性,值均为数组{})
noRollbackFor = {UserAccountException.class}
noRollbackForClassName(类全限定名)
rollbackFor
rollbackForClassName
4、事务只读属性
readOnly = false/true
5、事务超时属性
timeout = 3 //单位s
6、代码说明
package com.lty.tx;import java.util.concurrent.TimeUnit;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Service;import org.springframework.transaction.annotation.Isolation;import org.springframework.transaction.annotation.Propagation;import org.springframework.transaction.annotation.Transactional;@Service("bookShopService")public class BookShopServiceImpl implements BookShopService { @Autowired private BookShopDao bookShopDao; //添加事务注解 //1、使用propagation指定事务的传播行为,即当前的事务方法被另外一个事务方法调用时 //如何使用事务,默认取值为REQUIRED,即使用调用方法的事务 //REQUIRES_NEW:使用自己的事务,调用事务方法的事务被挂起 //2、使用isolation指定事务的隔离级别,最常用的取值为Isolation.READ_COMMITED //3、默认情况下Spring的声明式事务对所有的运行时异常均进行回滚,也可以通过对应的属性 //进行设置,通常情况下取默认值即可 //4、使用readOnly指定事务是否为只读,表示该事务只读取数据但不更新数据, //这样可以 帮助数据库引擎优化事务(若确实是只读取数据库值的方法,应设置readOnly=true) //5、使用timeout指定强制回滚事务之前事务可以占用的时间,以提高响应速度 @Transactional(propagation = Propagation.REQUIRES_NEW, isolation = Isolation.READ_COMMITTED,// noRollbackFor = {UserAccountException.class} readOnly = false, timeout = 3 //单位s ) @Override public void purchase(String username, String isbn) { try { TimeUnit.SECONDS.sleep(5); } catch (InterruptedException e) { } //1、获取书的单价 int price = bookShopDao.findBookPriceByIsbn(isbn); //2、更新书的库存 bookShopDao.updateBookStock(isbn); //3、更新用户余额 bookShopDao.updateUserAccount(username, price); }}
注意的几点
1、@Transactional 只能被应用到public方法上, 对于其它非public的方法,如果标记了@Transactional也不会报错,但方法没有事务功能。
2、默认情况下,一个有事务方法, 遇到RuntiomeException 时会回滚 . 遇到 受检查的异常 是不会回滚 的. 要想所有异常都回滚,要加上 @Transactional( rollbackFor={Exception.class,其它异常}) 。