数据库事务知识
-
事务的特性有四个
1.原子性(Atomicity)。即事务必须是一个不可分割的整体。事务中的操作要么一起成功要么一起失败。
2.一致性(Consistency)。即执行完数据操作后,数据不会被破坏。
3.隔离性(Isolation)。即事务之间的隔离。
4.持久性(Durability)。即数据库必须要保证每一条修改或插入数据都要永久地存放在磁盘中。
-
事务的隔离级别
1.READ_UNCOMMITTED。即事务A读取了事务B中未提交的修改数据。这就出现了脏读。
2.READ_COMMITTED。即事务A读取了事务B提交的更改数据。这就出现了不可重复读。
3.REPEATABLE_READ。即事务A读取了事务B提交的新增数据。这就出现了幻读。
4.SERIALIZABLE。此事务级别最高。解决了幻读。
事务隔离级别 | 脏读 | 不可重复读 | 幻读 |
---|---|---|---|
READ_UNCOMMITTED | 允许 | 允许 | 允许 |
READ_COMMITTED | 禁止 | 允许 | 允许 |
REPEATABLE_READ | 禁止 | 禁止 | 允许 |
SERIALIZABLE | 禁止 | 禁止 | 禁止 |
-
java查看数据库默认事务隔离级别
Connection conn = DriverManager.getConnection(url, username, passowrd);
DatabaseMetaData meta = conn.getMetaData();
//事务隔离级别
int isolation = meta.getDetaultTransactionIsolation(); -
Spring事务传播行为
spring一共提供了7种事务传播行为。
1.PROPAGATION_REQUIRED 如果没有事务,就新建一个事务;如果有事务,就加入当前事物。这也是Spring提供的默认事物传播行为。
2.PROPAGATION_REQUIRES_NEW 如果没有事务,就新建一个事务;如果有事务,就将当前事务挂起。意思是创建了一个新事务,它和原来的事务没有任何关系了。
3.PROPAGATION_NESTED 如果没有事务,就新建一个事务;如果有事务,就在当前事务中嵌套其他事务,所嵌套的子事务与主事务之间有关联的(当主事务提交或回滚,子事务也会提交或回滚)。
4.PROPAGATION_SUPPORTS 如果没有事务,就以非事务方式执行;如果有事务,就使用当前事务。
5.PROPAGATION_NOT_SUPPORTED 如果没有事务,就以非事务方式执行;如果有事务,就将当前事务挂起。
6.PROPAGATION_NEVER 如果没有事务,就以非事务方式执行;如果有事务,就抛出异常。
7.PROPAGATION_MANDATORY 如果没有事务,就抛出异常;如果有事务,就使用当前事务。
-
Spring 还提供了事务超时和只读事务
1.事务超时(Transaction Timeout)——为了解决事务时间太长,消耗太多资源的问题,所以故意给事务设置一个最大时长,如果超时了,就回滚事务。
2.只读事务(Readonly Transaction)——为了忽略那些不需要事务的方法,比如读取数据,这样可以有效地提高一些性能。