什么是事务?
事务在计算机科学中是一个非常重要的概念,特别是在数据库管理系统(DBMS)中。事务通常是指访问并可能更新数据库中各种数据项的一个程序执行单元(unit)。
具体来说,事务是一个不可分割的工作单位,由事务开始(begin transaction)和事务结束(end transaction)之间执行的全体操作组成。事务中的操作要么全部执行,要么全部不执行,这称为原子性。此外,事务必须保持数据库从一个一致性状态变到另一个一致性状态,这称为一致性。
在数据库操作中,事务也用于把多个要做的操作组合成一个整体,利用事务的特性来保证操作的安全性。如果一个事务做到一半出现任何错误,就会进行回滚操作,来恢复成最初的模样。
事务的特性通常包括原子性、一致性、隔离性和持久性,这四个属性通常称为ACID特性。这些特性保证了事务在数据库系统中的正确性和可靠性。
除了在数据库管理中的应用,事务的概念也被广泛用于其他计算机科学领域,如操作系统、编程语言等。
什么是spring中的事务传播行为呢?
是指由某一个事务传播行为修饰的方法被嵌套进另一个方法时事务如何传播。简单来说,当一个事务方法被另一个事务方法调用时,这个事务方法对另一个事务方法的态度就是事务传播行为。
Spring提供了以下七种事务传播行为:
PROPAGATION_REQUIRED
: 这是默认设置。如果当前存在事务,那么就使用当前事务。如果没有事务,则新建一个事务。PROPAGATION_SUPPORTS
: 如果当前存在事务,则支持当前事务。如果没有事务,则以非事务方式继续运行。PROPAGATION_MANDATORY
: 如果当前存在事务,则使用当前事务。如果没有事务,则抛出异常。PROPAGATION_REQUIRES_NEW
: 始终新建一个事务。如果当前存在事务,则挂起当前事务。PROPAGATION_NOT_SUPPORTED
: 始终非事务地执行,并挂起任何存在的事务。PROPAGATION_NEVER
: 非事务地执行,如果当前存在事务,则抛出异常。PROPAGATION_NESTED
: 如果当前存在事务,则嵌套事务作为一个子事务运行。如果没有事务,则按PROPAGATION_REQUIRED
执行。
简单示例:
1、PROPAGATION_REQUIRED
@Transactional(propagation = Propagation.REQUIRED)
public void method1() {
// 业务逻辑代码
method2(); // 调用另一个事务方法
}
@Transactional(propagation = Propagation.REQUIRED)
public void method2() {
// 业务逻辑代码
}
解释:如果method1()
被调用时已经存在事务,则method1()
加入该事务;如果method1()
被调用时没有事务,则创建一个新的事务。method2()
也会加入同一个事务。
2、PROPAGATION_SUPPORTS
@Transactional(propagation = Propagation.SUPPORTS)
public void method1() {
// 业务逻辑代码
method2(); // 调用另一个事务方法
}
@Transactional(propagation = Propagation.REQUIRED)
public void method2() {
// 业务逻辑代码
}
解释:如果method1()
被调用时存在事务,则method1()
加入该事务;如果method1()
被调用时没有事务,则以非事务的方式执行。method2()
会加入同一个事务。
3、PROPAGATION_MANDATORY
@Transactional(propagation = Propagation.MANDATORY)
public void method1() {
// 业务逻辑代码
method2(); // 调用另一个事务方法
}
@Transactional(propagation = Propagation.REQUIRED)
public void method2() {
// 业务逻辑代码
}
解释:强制要求method1()
被调用时存在事务,如果当前不存在事务,则抛出异常。method2()
会加入同一个事务。
4、PROPAGATION_REQUIRES_NEW
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void method1() {
// 业务逻辑代码
method2(); // 调用另一个事务方法
}
@Transactional(propagation = Propagation.REQUIRED)
public void method2() {
// 业务逻辑代码
}
解释:重新创建一个新的事务,无论method1()
被调用时是否已经存在事务。method2()
也会在新的事务中执行。
5、PROPAGATION_NOT_SUPPORTED
@Transactional(propagation = Propagation.NOT_SUPPORTED)
public void method1() {
// 业务逻辑代码
method2(); // 调用另一个事务方法
}
@Transactional(propagation = Propagation.REQUIRED)
public void method2() {
// 业务逻辑代码
}
解释:以非事务方式执行method1()
,如果method1()
被调用时存在事务,则把当前事务挂起。method2()
会加入同一个事务。
6、PROPAGATION_NEVER
@Transactional(propagation = Propagation.NEVER)
public void method1() {
// 业务逻辑代码
method2(); // 调用另一个事务方法
}
@Transactional(propagation = Propagation.REQUIRED)
public void method2() {
// 业务逻辑代码
}
解释:以非事务方式执行method1()
,如果method1()
被调用时存在事务,则抛出异常。method2()
无法执行,因为method1()
以非事务方式执行。
7、PROPAGATION_NESTED
@Transactional(propagation = Propagation.NESTED)
public void method1() {
// 业务逻辑代码
method2(); // 调用另一个事务方法
}
@Transactional(propagation = Propagation.REQUIRED)
public void method2() {
// 业务逻辑代码
}
解释:如果method1()
被调用时存在事务,则在嵌套事务内执行。嵌套事务继承了外部事务的隔离性。如果当前不存在事务,则创建一个新的事务。method2()
也会在嵌套事务中执行。