JDBC事务特性

1、 事务的四种特性(ACID)

  • 原子性(Atomicity):原子性是指事务是一个不可分割的执行单元或者叫工作单位,事务中的操作,要么都发生,要么都不发生。

  • 一致性(Consistency):事务前后数据的完整性必须保持一致。(数据库的数据执行后前后要保存一致)

  • 隔离性(Isolation):事务的隔离性是指多个用户并发访问数据库时,一个用户的事务不能被其它用户的事务所干扰,多个并发事务之间的数据要相互隔离,正常情况下数据库是做不到这一点的,可以设置隔离级别,但是效率会非常低。

  • 持久性(Duration):持久性是指一个事务一旦被提交,它对数据库中的数据的改变就是永久性的,接下来即使数据库发生故障也不应该对其有任何影响。

停电造成的问题

JDBC事务特性_第1张图片

2、 并发访问问题

如果不考虑隔离性,事务存在3个并发访问问题。

1:脏读:一个事务读到了另一个事务尚未提交的数据。

2:不可重复读:一个事务读到了另一个事务已经提交(update)的数据。引发另一个事务,在事务中的多次查询结果不一样。

3:虚读/幻读:一个事务读到了另一个事务已经提交(insert)的数据。导致另一个事务,在事务中多次查询的结果不一致。

3 、隔离级别:解决问题

数据库规范规定了四种隔离级别,分别用于描述两个事务并发的所有情况。select @@tx_isolation;

1:read uncommitted 读未提交,一个事务读到另一个事务没有提交的数据。

a) 存在:3个问题(脏读,不可重复读,虚读)。

b) 解决:0个问题

2:read commited 读未提交,一个事务读到另一个事务已经提交的数据

a) 存在:2个问题(不可重复读,虚读)。

b) 解决:1个问题(脏读)

3:repeatable read:可重复读,在一个事务中读到的数据始终保持一致,无论另一个事务是否提交。

a) 存在:1个问题(虚读)。

b) 解决:2个问题(脏读,不可重复读)

4:serializable 串行化,同时只能执行一个事务,相当于事务中的单线程。

a) 存在:0个问题

b) 解决:3个问题(脏读,不可重复读,虚读)

  • 安全和性能对比

    • 安全性:serializable>repeatable read>read committed > read uncommitted

    • 性能:serializable

  • 常见数据库的默认隔离级别:

    • MySQL:repeatable read

    • Oracle:read committed

  • 设置数据库的隔离级别

你可能感兴趣的:(JDBC,数据库,java)