3

Java知识点总结(JDBC-事务)

@(Java知识点总结)[Java, JDBC]

事务

事务基本概念

  • 一组要么同时执行成功,要么同时执行失败的 SQL 语句。是数据库操作的一个执行单元!
  • 事务开始于:

    • 执行 commit 或 rollback 语句。
    • 执行一条 DDL 语句,例如 create table 语句;在这种情况下,会自动执行 commit 语句。
    • 执行一条 DCL 语句,例如 grant 语句;在这种情况下,会自动执行 commit 语句。
    • 断开与数据库的连接。
    • 执行了一条 DML 语句,该语句却失败了;在这种情况下,会为这个无效的 DML 语句执行 rollback 语句。

事务的四大特点(ACID)

  • atomicity(原子性)

    • 表示一个事务内的所有操作是一个整体, 要么全部成功,要么全失败
  • consistency(一致性)

    • 表示一个事务内有 一个操作失败时 ,所有的更改过的数据都必须 回滚到修改前的状态 ;
  • isolation(隔离性)

    • 事务查看数据时 数据所处的状态 ,要么是另一并发事务 修改它之前 的状态,要么是另一事务 修改它之后 的状态,事务不会查看中间状态的数据。
  • durability(持久性)

    • 持久性事务完成之后,它对于系统的 影响是永久性的 。

事务并发处理可能引起的问题

  1. 读脏(dirty read):一个事务读取了另一个事务尚未提交的数据,
  2. 不可重复读(non-repeatable read):一个事务的操作导致另一个事务前后两次读取到不同的数据
  3. 幻读(phantom read):一个事务的操作导致另一个事务前后两次查询的结果数据量不同。

隔离级别

4个等级的事务隔离级别,在相同的数据环境下,使用相同的输入,执行相同的工作,根据不同的隔离级别,可以导致不同的结果。不同事务隔离级别能够解决的数据并发问题的能力是不同的。

  • SERIALIZABLE(串行化)

    • 不会出现任何并发问题,因为它是对同一数据的访问是串行的,非并发访问的;

性能最差

  • REPEATABLE READ(可重复读)(MySQL)

    • 防止脏读和不可重复读,不能处理幻读
    • 性能比SERIALIZABLE好
  • READ COMMITTED(读已提交数据)(Oracle)

    • 防止脏读,不能处理不可重复读和幻读;
    • 性能比REPEATABLE READ好
  1. READ UNCOMMITTED(读未提交数据)

    • 可能出现任何事物并发问题,什么都不处理。
    • 性能最好
MySQL隔离级别

MySQL的默认隔离级别为Repeatable read,可以通过下面语句查看:

SELECT @@`TX_ISOLATION`;

也可以通过下面语句来设置当前连接的隔离级别:

SET TRANSACTION ISOLATION LEVEL REPEATABLE READ ;//[4选1]
JDBC设置隔离级别

con.setTransactionIsolation(int level) :参数可选值如下:


Connection.TRANSACTION_READ_UNCOMMITTED;
Connection.TRANSACTION_READ_COMMITTED;
Connection.TRANSACTION_REPEATABLE_READ;
Connection.TRANSACTION_READ_SERIALIZABLE。

苏生
803 声望725 粉丝