1、自定义设置回滚异常
rollbackFor和rollbackForClassName回滚的异常
/**
 * @Transactional 表示使用通知( 启用事务 ) <br/>
 * rollbackFor 属性可以自定义哪些异常可以回滚事务 <br/>
 * rollbackForClassName 属性可以自定义哪些全类名的异常回滚事务 <br/>
 */
@Transactional(rollbackForClassName = "java.io.FileNotFoundException")
public void multiUpdate() throws Exception {
    bookDao.updateBook();
    int i = 12;
    if (i == 12) {
        throw new FileNotFoundException();
    }
    userDao.updateUser();
}
 
2、事务的只读属性
insert , update , delete 语句是写操作
 select 是读操作
 只读,就是只允许用户查询数据 , 不允许用户修改数据.
测试readOnly只读属性
/**
 * @Transactional 表示使用通知( 启用事务 ) <br/>
 *
 * readOnly 它可以设置当前方法是否允许写操作 <br/>
 *  默认是允许的.所以它的默认值是false. <br/>
 *  如果设置readOnly = true就不允许执行写操作的sql语句.
 */
@Transactional(readOnly = true)
public void multiUpdate() throws Exception {
    bookDao.updateBook();
    userDao.updateUser();
}
 

3、事务超时属性timeout (秒为单位)
/**
 * @Transactional 表示使用通知( 启用事务 ) <br/>
 *
 *  timeout属性可以设置多少秒内不再允许执行sql语句( 在指定秒数内要完成事务 ) <br/>
 *  timeout = 3 表示3秒后不允许执行sql语句,否则就是操作超时 <br/>
 */
@Transactional(timeout = 3)
public void multiUpdate() throws Exception {
    bookDao.updateBook();
    Thread.sleep(5000);
    userDao.updateUser();
}
 
超时的异常信息:

4、事务的传播特性propagation
什么是事务的传播特性 ( 传播行为 ):
当事务方法被另一个事务方法调用时,必须指定事务应该如何传播。例如:方法可能继续在现有事务中运行,也可能开启一个新事务,并在自己的事务中运行。
 事务的传播行为可以由传播属性指定。Spring定义了7种类传播行为。
事务的传播特性,有以下几种类型:
 
5、注解演示事物传播特性
UserService
 BookService
 TransactionService
大小事务传播特性都是REQUIRED
	@Transactional(propagation = Propagation.REQUIRED)
	public void multiTransaction() {
	@Transactional(propagation = Propagation.REQUIRED)
	public void updateBook() {
	@Transactional(propagation=Propagation.REQUIRED)
	public void updateUser() { }
 

大小事务传播特性都是REQUIRES_NEW
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void multiTransaction()
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void updateBook()
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void updateUser()
 

大事务是REQUIRED,小1REQUIRED,小2REQUIRES_NEW
@Transactional(propagation = Propagation.REQUIRED)
public void multiTransaction()
@Transactional(propagation = Propagation.REQUIRED)
public void updateBook()
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void updateUser()
 










![[Data structure]双链表 | 一文带你了解线性数据结构之一的双链表](https://img-blog.csdnimg.cn/91fefc90070b42df994ffc2e086eb0b1.png)








