• JDBC的事务支持


    1.事务(Transaction)的四个属性(ACID)
    原子性(Atomic) 对数据的修改要么全部执行,要么全部不执行。
    一致性(Consistent) 在事务执行前后,数据状态保持一致性。
    隔离性(Isolated) 一个事务的处理不能影响另一个事务的处理。
    持续性(Durable) 事务处理结束,其效果在数据库中持久化。
    2.事务并发处理可能引起的问题
    脏读(dirty read) 一个事务读取了另一个事务尚未提交的数据,
    不可重复读(non-repeatable read) 一个事务的操作导致另一个事务前后两次读取到不同的数据
    幻读(phantom read) 一个事务的操作导致另一个事务前后两次查询的结果数据量不同。

    举例:
    事务A、B并发执行时,
    当A事务update后,B事务select读取到A尚未提交的数据,此时A事务rollback,则B读到的数据是无效的"脏"数据。
    当B事务select读取数据后,A事务update操作更改B事务select到的数据,此时B事务再次读去该数据,发现前后两次的数据不一样。
    当B事务select读取数据后,A事务insert或delete了一条满足A事务的select条件的记录,此时B事务再次select,发现查询到前次不存在的记录("幻影"),或者前次的某个记录不见了。
    JDBC的事务支持

    JDBC对事务的支持体现在三个方面:

    1.自动提交模式(Auto-commit mode)
    Connection提供了一个auto-commit的属性来指定事务何时结束。
    a.当auto-commit为true时,当每个独立SQL操作的执行完毕,事务立即自动提交,也就是说每个SQL操作都是一个事务。

    一个独立SQL操作什么时候算执行完毕,JDBC规范是这样规定的:
    对数据操作语言(DML,如insert,update,delete)和数据定义语言(如create,drop),语句一执行完就视为执行完毕。
    对select语句,当与它关联的ResultSet对象关闭时,视为执行完毕。
    对存储过程或其他返回多个结果的语句,当与它关联的所有ResultSet对象全部关闭,所有update count(update,delete等语句操作影响的行数)和output parameter(存储过程的输出参数)都已经获取之后,视为执行完毕。

    b. 当auto-commit为false时,每个事务都必须显示调用commit方法进行提交,或者显示调用rollback方法进行回滚。auto-commit默认为true。
    JDBC提供了5种不同的事务隔离级别,在Connection中进行了定义。
    2.事务隔离级别(Transaction Isolation Levels)
    JDBC定义了五种事务隔离级别:
    TRANSACTION_NONE JDBC驱动不支持事务
    TRANSACTION_READ_UNCOMMITTED 允许脏读、不可重复读和幻读。
    TRANSACTION_READ_COMMITTED 禁止脏读,但允许不可重复读和幻读。
    TRANSACTION_REPEATABLE_READ 禁止脏读和不可重复读,单运行幻读。
    TRANSACTION_SERIALIZABLE 禁止脏读、不可重复读和幻读。
    3.保存点(SavePoint)
    JDBC定义了SavePoint接口,提供在一个更细粒度的事务控制机制。当设置了一个保存点后,可以rollback到该保存点处的状态,而不是rollback整个事务。
    Connection接口的setSavepoint和releaseSavepoint方法可以设置和释放保存点。
    JDBC规范虽然定义了事务的以上支持行为,但是各个JDBC驱动,数据库厂商对事务的支持程度可能各不相同。如果在程序中任意设置,可能得不到想要的效果。

  • 相关阅读:
    redis学习--Hashes数据类型
    redis学习--String数据类型。
    redis学习一
    redis命令大全
    MongoDB学习笔记(索引)
    ECharts的使用(经典博客)
    php中五种常见的设计模式
    实用的借口
    php中socket的使用
    jquery仿凡客诚品图片切换的效果实例代码
  • 原文地址:https://www.cnblogs.com/xz1367/p/2303793.html
Copyright © 2020-2023  润新知