什么叫事务(Transaction)

本文详细介绍了数据库事务的概念及其四大特性:原子性、一致性、隔离性和持久性,并通过一个存钱的例子生动地展示了事务的重要性和应用场景。

叫事务? 这些就是数据库特有的术语了。懒虫在这里口头解释:就是把多件事情当做一件事情来处理。也就是大家同在一条船上,要活一起活,要over一起over !

事务(Transaction)是访问并可能更新数据库中各种数据项的一个程序执行单元(unit)。事务通常由高级数据库操纵语言或编程语言(如SQL,C++或Java)书写的用户程序的执行所引起,并用形如begin transaction和end transaction语句(或函数调用)来界定。事务由事务开始(begin transaction)和事务结束(end transaction)之间执行的全体操作组成。

例如:在关系数据库中,一个事务可以是一条SQL语句,一组SQL语句或整个程序。

事务是恢复和并发控制的基本单位。

事务应该具有4个属性:原子性、一致性、隔离性、持续性。这四个属性通常称为ACID特性。

原子性(atomicity)。一个事务是一个不可分割的工作单位,事务中包括的诸操作要么都做,要么都不做。

一致性(consistency)。事务必须是使数据库从一个一致性状态变到另一个一致性状态。一致性与原子性是密切相关的。

隔离性(isolation)。一个事务的执行不能被其他事务干扰。即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰。

持久性(durability)。持续性也称永久性(permanence),指一个事务一旦提交,它对数据库中数据的改变就应该是永久性的。接下来的其他操作或故障不应该对其有任何影响。


   我为什么要使用事务? 俺这里再举个很俗很俗的例子:

     俺到银行存钱,于是有这么几个步骤:
       1、把钱交给工作人员;2、工作人员填单;3、将单子给我签字;4、工作人员确认并输入电脑。

   要是,要是我把钱交给工作人员之后,进行到3我签字了。那哥们突然心脏病发作,over掉了,那,我的钱还没有输入电脑,但我却交了钱又签字确认了,而并没有其他任何记录。我岂不是要亏死了???我的血汗钱啊!赶紧退给我!!

   于是,在数据库里产生了这么一个术语:事务(Transaction),也就是要么成功,要么失败,并恢复原状。
  
   还是写程序把:

   Create Proc sp我去存款(@M Money , @iOperator Int)
   As
   Begin
    Declare @i int

    Begin Tran           --激活事务
     Exec @i=sp交钱 @m,@iOperator
     if @i<>0           --这里一般用系统错误号 @@Error。 我这里为了举例子没有用到。需要根据实际情况。
     begin
      Rollback Tran                   --回滚事务
      RaisError ('银行的窗口太少了,我懒得排队,不交了!:( ', 16, 1) with Log --记录日志
      Return -1                     --返回错误号
     end

     Exec @i=sp填单 @m,@iOperator
     if @i<>0
     begin
      Rollback Tran                   --回滚事务
      RaisError ('银行的哥们打印机出了点毛病,打印不出单子来,把钱退回来给我吧??', 16, 1) with Log
      Return -2                     
     end

     Exec @i=sp签字 @m
     if @i<>0
     begin
      Rollback Tran                   --回滚事务
      RaisError ('我 靠?什么烂银行,换了3支笔都写不出水来!!老子不存了!!不签!', 16, 1) with Log 
      Return -3                     
     end

     Exec @i=sp输入电脑 @m,@iOperator
     if @i<>0
     begin
      Rollback Tran                   --回滚事务
      RaisError ('什么意思?磁盘空间已满?好了好了,把钱给我,我到旁边的这家银行!', 16, 1) with Log 
      Return -4                     
     end
 
    Commit Tran        --提交事务
    Return 0
  End
 

       ----------------------------------------------------------------------
       以上是伪代码,模拟我去存款的过程。

 

在 Java 应用开发中,事务Transaction)是指一组逻辑操作单元,这些操作要么全部成功执行,要么全部失败回滚,以确保数据的一致性和完整性。事务通常用于处理涉及多个步骤的数据操作,例如银行转账、订单提交等业务场景,其中任何一个步骤的失败都会导致整个事务被撤销[^1]。 Java 中的事务管理可以通过多种方式实现,包括 JDBC 事务、JTA(Java Transaction API)事务以及容器管理事务[^1]。JDBC 事务是基于数据库连接的本地事务,适用于单一数据源的操作;而 JTA 事务则是 Java EE 提供的分布式事务管理接口,支持跨多个资源(如多个数据库或消息队列)的事务协调[^2]。此外,在 Spring 框架中,事务管理得到了进一步简化和抽象,通过声明式事务配置(如 `@Transactional` 注解),开发者可以非常方便地开启和管理事务[^2]。 ### Java 事务的基本特性(ACID) - **原子性(Atomicity)**:事务是一个不可分割的工作单位,事务中的所有操作要么全部完成,要么全部不完成。 - **一致性(Consistency)**:事务必须保证系统从一个一致的状态转换到另一个一致的状态。 - **隔离性(Isolation)**:多个事务并发执行时,一个事务的执行不应影响其他事务的执行。 - **持久性(Durability)**:一旦事务提交,其对数据的修改应该是永久性的,即使系统发生故障也不应丢失[^3]。 ### 示例代码 以下是一个使用 Spring 的声明式事务管理的简单示例: ```java import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @Service public class AccountService { @Autowired private AccountRepository accountRepository; @Transactional public void transferMoney(Long fromAccountId, Long toAccountId, double amount) { Account fromAccount = accountRepository.findById(fromAccountId).orElseThrow(); Account toAccount = accountRepository.findById(toAccountId).orElseThrow(); fromAccount.setBalance(fromAccount.getBalance() - amount); toAccount.setBalance(toAccount.getBalance() + amount); accountRepository.save(fromAccount); accountRepository.save(toAccount); } } ``` 上述代码中,`@Transactional` 注解表明该方法需要在一个事务上下文中执行。如果方法执行过程中抛出异常,则事务会自动回滚;否则事务会在方法正常结束时提交。 ### 注意事项 - 在使用事务时,应当避免在同一个事务中嵌套不同类型的事务管理机制,比如不要在 JTA 事务中嵌套 JDBC 事务[^1]。 - 事务应尽可能短小,避免长时间占用资源,从而提高系统的并发性能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值