Java-Note-事务管理

  • 一个数据库事务通常包含了一个序列的对数据库的读/写操作. 它的存在包含有以下两个目的:
    1. 为数据库操作序列提供了一个从失败中恢复到正常状态的方法, 同时提供了数据库即使在异常状态下仍能保持一致性的方法
    2. 当多个应用程序在并发访问数据库时, 可以在这些应用程序之间提供一个隔离方法, 以防止彼此的操作互相干扰
  • ACID性质
    • 原子性(Atomicity): 事务作为一个整体被执行, 包含在其中的对数据库的操作要么全部被执行, 要么都不执行
    • 一致性(Consistency): 事务应确保数据库的状态从一个一致状态转变为另一个一致状态. 一致状态的含义是数据库中的数据应满足完整性约束
    • 隔离性(Isolation): 多个事务并发执行时, 一个事务的执行不应该影响其他事务的执行
    • 持久性(Durability): 已被提交的事务对数据库的修改应该永久保存在数据库中
  • 事务并发
    • 可能引起的问题:
      1. 脏读: 一个事务读到另一个事务未提交的更新数据(一个事务在执行时, 其它事务可以读)
      2. 不可重复读: 一个事务两次读同一行数据, 可是这两次读到的数据不一样(一个事务在执行时, 其它事务可以修改)
      3. 幻读: 一个事务执行两次查询, 但第二次查询比第一次查询多出了一些数据行(一个事务在执行时, 其它事务可以写)
      4. 丢失更新: 撤销一个事务时, 把其它事务已提交的更新的数据覆盖了
  • 事务隔离级别
    1. TRANSACTION_NONE_JDBC: 驱动不支持事务
    2. TRANSACTION_READ_UNCOMMTTED: 允许脏读/不可重复读/幻读
    3. TRANSACTION_READ_COMMITTED: 禁止脏读, 但允许不重复读和幻读
    4. TRANSACTION_REPEATABLE_READ: 禁止脏读和不可重复读, 但允许幻读
    5. TRANSACTION_SERIALIZABLE: 禁止脏读/不可重复读/幻读
    • 一般设置TRANSACTION_READ_COMMITTED就差不多了, 剩下的通过使用数据库的锁来帮我们处理别的