目录
  1. 1. JDBC处理事务
    1. 1.1. 事务(transaction)
      1. 1.1.1. 一条或多条SQL语句组成的不可分割的单元,只有事务中所有的操作都完成,才会提交给数据库。在JDBC中,通常用commit()和rollback()方法来结束事务的操作。commit表示提交事务,rollback表示事务回滚。这两种方法都在java.sql.Connection类中。
      2. 1.1.2. 一般而言,系统默认的操作时自动提交,即操作成功后系统自动调用commit()方法,若未成功完成事务则调用rollback()方法。
      3. 1.1.3. 也可以通过调用setAutoCommit(false)方法来禁止自动提交。这样可以将一连串的数据库操作表达式作为一个事务,操作完成后整体commit()提交;如果有某条语句操作失败,在catch代码块中调用rollback()方法进行事务回滚(数据恢复到未执行语句之前)。
    2. 1.2. 多个线程请求相同的数据可能产生的问题:
    3. 1.3. JDBC支持不同的事务类型,由Connection对象指派
NewPost

JDBC处理事务

事务(transaction)

一条或多条SQL语句组成的不可分割的单元,只有事务中所有的操作都完成,才会提交给数据库。在JDBC中,通常用commit()和rollback()方法来结束事务的操作。commit表示提交事务,rollback表示事务回滚。这两种方法都在java.sql.Connection类中。

一般而言,系统默认的操作时自动提交,即操作成功后系统自动调用commit()方法,若未成功完成事务则调用rollback()方法。

也可以通过调用setAutoCommit(false)方法来禁止自动提交。这样可以将一连串的数据库操作表达式作为一个事务,操作完成后整体commit()提交;如果有某条语句操作失败,在catch代码块中调用rollback()方法进行事务回滚(数据恢复到未执行语句之前)。

多个线程请求相同的数据可能产生的问题:

  1. 读脏数据:A与B进行并发操作。事务A对数据进行更新但未提交,此时事务B对更新后的数据进行读取,但之后事务A进行回滚。此时事务B读取的是无效的“脏”数据。
  2. 不可重复读:A与B并发执行。事务B读取数据后事务A对数据进行更新操作,B再次读取数据发现前后两次读到数据不同。
  3. 虚读:A与B并发执行。事务B读取数据后,事务A新增或删除了读取数据的记录,B再次查询后发现数据量与之前不相符。

JDBC支持不同的事务类型,由Connection对象指派

  1. TRANSACTION_NONE JDBC:不支持事务
  2. TRANSACTION_READ_UNCOMMITTED:提交前可读,可能读脏数据,不可重复读,虚读。
  3. TRANSACTION_READ_COMMITTED:已提交读,排除了读脏数据。
  4. TRANSACTION_REPEATABLE_READ:可重复读,排除了读脏数据,和不可重复读的问题。
  5. TRANSCCTION_SERIALIZABLE:可序列化:最高的事务级别,排除了上述全部问题。

文章作者: Lu Bo
文章链接: http://yoursite.com/2019/10/25/NewPost/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 卢波
打赏
  • 微信
  • 支付寶