JAVA事务

java事务包含: InnerDB

  JDBC型事务:应用于单一数据库。

  JTA型事务:适用于分布式数据库。

  

  jdbc事务处理的同一资源链接内的业务,获取链接之后,如果这个事务中存在多个sql业务处理,其中任意一个失败,则整体失败,可回滚。

    使用方式为设置不自动提交 : AutoCommit = false , connection.commit(); connection.rollback();

  JTA事务,使用UserTransaction,可用来处理同一业务中对不同库操作的事务处理,当有失败的时候,可整体回滚。

    使用方式变更为:begin(),commit(),rollback();

  事务要遵循ACID原则,即:原子性、一致性、隔离性、持久性。

  A(atomicity):即一个事务里面的操作要么全部成功,要么全部失败。

  C(Consistency):事务的执行使得数据库从一种正确状态转换成另一种正确状态。

  I(isolation):在事务正确提交之前,不允许把该事务对数据的任何改变提供给任何其他事务,即在事务正确提交之前,它可能的结果不应显示给任何其他事务。

  D(durability):事务正确提交后,其结果将永久保存在数据库中,即使在事务提交后有了其他故障,事务的处理结果也会得到保存。

  对于同时运行的多个事务,当这些事务访问数据库中相同的数据时,如果没有采取必要的隔离机制,就会导致各种并发问题,这些并发问题可归纳为以下几类:

    第一类丢失更新:撤销一个事务时,把其他事务已提交的更新数据覆盖。 

    脏读:一个事务读到另一个事务为提交的更新数据。

    虚读:一个事务读到另一个事务已提交的新插入的数据。  

    不可重复读:一个事务读到另一个事务已提交的更新数据。

    第二类丢失更新:这是不可重复读中的特例,一个事务覆盖另一个事务已提交的更新数据。  

数据库隔离级别:

  数据库隔离级别分为4种:

    1、串行化(Serializable):一个事务在执行过程中完全看不到其他事务对数据库所做的更新。

    2、可重复读(Repeatable Read):  一个事务在执行过程中可以看到其他事务已经提交的新插入的记录,但是不能看到其他事务对已有记录的更新。

    3、读已提交数据(Read Commited):一个事务在执行过程中可以看到其他事务已经提交的新插入的记录,而且能看到其他事务已经提交的对已有记录的更新

    4、读未提交数据(Read Uncomitted):一个事务在执行过程中可以看到其他事务没有提交的新插入的记录,而且能看到其他事务没有提交的对已有记录的更新。

  等级高低由上而下,隔离级别越高,越能保证数据一致性和完整性,但是对并发性能的影响也越大。一般数据库隔离级别定义在Read Commited,它能够避免脏读,而且具有较好的并发性能,其他额外的问题通过应用程序来处理。

  基本上在Read Commited的时候,可能会产生不可重复读和第二类丢失更新。可以采用悲观锁和乐观锁处理。

原文地址:https://www.cnblogs.com/binbang/p/6419975.html