朝阳区北京网站建设,宁波网站建设xpckj,济宁做网站的,上海网站建设专业公司哪家好事务的四大特性
1.原子性#xff08;Atomicity#xff09;#xff1a;事务不可再分#xff0c;要么都执行#xff0c;要么都不执行。 2.一致性#xff08;Consistency#xff09;#xff1a;事务执行前后#xff0c;数据的完整性保持一致#xff0c;即修改前后数据总… 事务的四大特性
1.原子性Atomicity事务不可再分要么都执行要么都不执行。 2.一致性Consistency事务执行前后数据的完整性保持一致即修改前后数据总量是一样的大概。 3.隔离性Isolation一个事务执行过程中不会受到其他事务干扰。 4.持久性Durability事务一旦结束对数据库的影响是永久的。数据持久化到数据库中。在并行程序中可能会出现的问题
脏读当 A事务 读取 B事务 未提交的数据后B事务 回滚导致 A事务 读取到的数据为脏数据。 不可重复读A事务 读取第一次读取数据后B事务 对该数据进行了修改并提交A事务 再去读取数据时前后数据结果不一致。 幻读A事务 读取第一次读取数据后B事务 又插入或删除了新的数据并提交A事务 再去读取数据时前后结果不一致。 事务(Transaction)是访问并可能更新数据库中各种数据项的一个程序执行单元(unit)。事务通常由高级数据库操纵语言或编程语言(如 SQL、C 或 Java)书写的用户程序的执行所引起并用形如 begin transaction 和 end transaction 语句(或函数调用)来界定。事务由事务开始(begin transaction)和事务结束(end transaction)之间执行的全体操作组成。例如在关系数据库中一个事务可以是一条 SQL 语句一组 SQL 语句或整个程序。
事务隔离级别定义了在一个事务中哪些数据是对当前执行的语句“可见”的。在并发访问数据库时事务隔离级别定义了多个事务之间对于同个目标数据源访问时的可交叉程度。可交叉程度
1.Dirty Read(脏读) 看到的数据则是不正确的
当一个事务能看见另外一个事务未提交的数据时就称为脏读。如果这个事务被回滚而不是提交了那么其它事务看到的数据则是不正确的是“脏”的。 2.Non-repeatable Read(不可重复读) 两次读取到的数据不同
假设事务 A 读取了一行数据接下来事务 B 改变了这行数据之后事务 A 再一次读取该行数据结果就是事务 A 两次读取到的数据不同。 3.Phantom Read(幻读) 发现多出来一条数据
假设事务 A 通过一个 where 条件读取到了一个结果集此时事务 B 插入了一条符合事务 A 的 where 条件的数据之后事务 A 再次执行同样的查询时发现多出来一条数据。 三、事务隔离级别(Isolation) JDBC 规范增加了隔离级别来满足了 SQL:2003 定义的 4 种事务隔离级别。在安装MySQL时安装默认的隔离级别就是可重复读。来查看当前隔离级别。隔离级别从最宽松到最严格排序如下所示
1.TRANSACTION_NONE 这意味着当前的 JDBC 驱动不支持事务也意味着这个驱动不符合 JDBC 规范。
2.READ_UNCOMMITTED(读未提交) 允许事务看到其它事务修改了但未提交的数据这意味着有可能是脏读、不可重复读或者幻读。
3.READ_COMMITTED(读提交) 一个事务在未提交之前所做的修改不会被其它事务所看见。这能避免脏读但避免不了不可重复读和幻读。
4.REPEATABLE_READ(可重复读取) MySQL默认的事务隔离级别 避免了脏读和不可重复读但幻读依然是有可能发生的。
5.SERIALIZABLE(序列化) 避免了脏读、不可重复读以及幻读。
四、Propagation用来枚举事务的传播行为 所谓事务的传播行为就是多个事务方法相互调用时事务如何在这些方法间传播。Spring 支持 7 种事务传播行为默认为 REQUIRED。
1.REQUIRED Transactional(propagationPropagation.REQUIRED) 如果当前有事务加入到这个事务中。如果当前没有事务就新建一个事务。
2.REQUIRES_NEW Transactional(propagationPropagation.REQUIRES_NEW) 不管是否存在事务都创建一个新的事务原来的挂起新的执行完毕继续执行老的事务。表示当前方法必须运行在它自己的事务中。如果使用 JTATransactionManager 的话则需要访问 TransactionManager。
3.MANDATORY Transactional(propagationPropagation.MANDATORY) 表示该方法必须在事务中运行如果当前不存在事务则会抛出一个异常。不会主动开启一个事务。
4.NEVER Transactional(propagationPropagation.NEVER) 表示该方法不应该运行在事务上下文中如果当前正有一个事务在运行则会抛出异常。(与Propagation.MANDATORY相反)。
5.SUPPORTS Transactional(propagationPropagation.SUPPORTS) 表示当前方法不需要事务上下文但是如果存在当前事务的话那么这个方法会在这个事务中运行。
6.NOT_SUPPORTED Transactional(propagationPropagation.NOT_SUPPORTED) 表示该方法不应该运行在事务中如果存在当前事务在该方法运行期间当前事务将被挂起。如果使用 JTATransactionManager 的话则需要访问 TransactionManager。
7.NESTED Transactional(propagationPropagation.NESTED) 表示如果当前已经存在事务那么该方法将会在嵌套事务中运行。嵌套的事务可以独立于当前事务进行单独地提交或回滚。如果当前不存在事务那么其行为等价于 Propagation.REQUIRED。嵌套事务一个非常重要的概念就是内层事务依赖于外层事务。外层事务失败时会回滚内层事务所做的动作。而内层事务操作失败并不会引起外层事务的回滚。
综上所述NESTED 和 REQUIRES_NEW 非常相似都是开启一个属于它自己的新事务。使用 REQUIRES_NEW 时内层事务与外层事务就像两个独立的事务一样一旦内层事务进行了提交后外层事务不能对其进行回滚。当内部事务开始执行时, 外部事务将被挂起内务事务结束时外部事务将继续执行。两个事务互不影响两个事务不是一个真正的嵌套事务同时它还需要 JTA 事务管理器的支持。
使用 NESTED 时外层事务的回滚可以引起内层事务的回滚而内层事务的异常并不会导致外层事务的回滚它是一个真正的嵌套事务。嵌套事务开始执行时它将取得一个 savepoint如果这个嵌套事务失败将回滚到此 savepoint。嵌套事务是外部事务的一部分只有外部事务结束后它才会被提交。