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