1.什么是事务

事务是逻辑上的一组操作,要么都执行,要么都不执行。

咱们零碎的每个业务办法可能包含了多个原子性的数据库操作,比方上面的 savePerson() 办法中就有两个原子性的数据库操作。这些原子性的数据库操作是有依赖的,它们要么都执行,要不就都不执行。

public void savePerson() {  personDao.save(person); personDetailDao.save(personDetail); }

另外,须要分外留神的是:事务是否失效数据库引擎是否反对事务是要害。比方罕用的 MySQL 数据库默认应用反对事务的innodb引擎。然而,如果把数据库引擎变为 myisam,那么程序也就不再反对事务了!

搭配视频教程学习:https://www.bilibili.com/vide...

2.在什么时候想到应用事务

当咱们的操作波及到多个表,或者是多个sql语句的减少insert删除delete批改update的时候,须要保障这些语句都是胜利能力实现咱们的性能;或者保障这些语句都失败,保障操作是符合要求的。最明了的例子就是转账,从A账户转到B账户中,要保障从A中扣除的金额肯定要加到B里去。如果A到B转账胜利,那么A扣B加,要保障A和B的账户是平衡的。如果A向B转账的过程中扣款失败了,那就应该把操作都回退,A也不扣,B也不加,保障A和B中账户数据的均衡。

在java代码中写程序,管制事务,此时事务应该放在哪里呢?

在开发中,事务是放在serviceImpl类的业务办法上的,因为一个业务办法可能波及到多个dao的调用,执行多个sql语句。

3.应用JDBC拜访数据库,还是Mybatis拜访数据库怎么处理事务

JDBC拜访数据库,处理事务:连贯对象Connection conn;事务提交 conn.commit ();事务回滚:conn.rollback ();

Mybatis 拜访数据库,处理事务:事务提交:SqlSession.commit ();事务回滚:SqlSession.rollback ();

4. 问题3中事务的解决形式有什么有余

(1)不同的数据库拜访技术,处理事务的对象,办法不同。JDBC应用的是Connection对象,Mybatis拜访对象应用的事SqlSession。办法不同就须要理解不同数据库拜访技术应用事务的原理。

(2)把握多种数据库中事务的解决逻辑,晓得什么时候提交,什么时候回滚。

(3)处理事务的多种办法。

总结:多种数据库的拜访技术,有不同的事务处理的机制,对象,办法。

5.怎么解决问题4中的这些有余

spring提供了一种处理事务的对立模型,能应用对立的步骤,形式,实现多种不同数据库拜访技术的事务处理。

应用spring的事务处理机制,能够实现MyBatis拜访数据库的事务处理。

应用spring的事务处理机制,能够实现Hibernate拜访数据库的事务处理

6.处理事务须要怎么做,做什么

Spring处理事务的模型,应用的步骤都是固定的。咱们只须要把事务应用的信息提供给spring就能够了。

(1) 事务外部提交,回滚事务,应用的是事务管理器对象,代替咱们实现事务的提交commit()和回滚rollback ()操作。事务管理器是一个接口和他的泛滥实现类。事务管理器是PlatformTransactionManager接口对象,接口中定义了事务的重要办法:一个是提交commit(),一个是回滚rollback();

这个接口的实现类有很多:spirng把每一种数据库拜访技术对应的事务处理类都创立好了。

如果咱们应用的是MyBatis拜访数据库,那Spring创立好的是DataSourceTansactionManager;

如果咱们应用的是Hibernate拜访数据库,那Spring创立好的是HibernateTansactionManager。

那咱们怎么去用Spring创立好的这些事务处理类呢?

咱们须要通知Spring咱们应用的是那种数据库拜访技术。

怎么通知Spring呢?

须要申明数据库拜访技术对应的事务管理器的实现类,在spring的配置文件中应用申明就能够了,申明之后spring就晓得咱们用的是那种数据库拜访技术了。

例如,咱们要应用MyBatis拜访数据库,咱们就应该在xml配置文件中申明一个DataSourceTansactionManager的bean对象;

(2)咱们的业务办法须要什么样的事务呢?须要提供一下事务的类型。

  • 阐明办法须要的事务:

事务的隔离级别:有4个值。在TransactionDefinition中定义了事务形容相干的3类常量:别离是事务隔离级别、事务流传行为以及事务默认超时时限。在事务隔离级别中定义了5个事务隔离级别的常量,这些常量都以ISOLATION_结尾,形如ISOLATION_xxx 。

default:采纳数据库默认的隔离级别。MySql的默认隔离级别为可反复读(repeatable_read ),Oracle 默认为读已提交(read_commit )。

另外的4个真正有效值:

  1. read _uncommitted:读未提交。未解决任何并发问题。
  2. read _commited:读已提交。解决脏读,存在不可反复读和幻读。
  3. repeatable_read:可反复读。解决脏读和不可反复读,存在幻读。
  4. serializable:串行化,不存在并发问题。
  • 事务的超时工夫(timeout),示意一个办法最长的执行工夫,如果办法执行时超过了这个工夫,事务就回滚。超时工夫的单位是s,默认是-1,代表没有超时工夫。

事务的流传行为:管制业务办法是不是有事务的,是什么样的事务的。

  • 事务的流传行为一共有7个(propagation_xxx):示意咱们的业务办法在调用时,事务在办法之间是如何应用的。通过流传行为,咱们能管制这个办法到底有没有事务,有什么样的事务。

propagation _required :指定的办法必须有事务。若存在事务,就退出到以后事务中,若没有事务就创立一个新事务。是spring中最常见的事务流传行为,也是默认的事务流传行为。

举例:

如果流传行为加在doOther()办法上。doSome()办法内调用doOther()办法。如果doSome()办法在调用doOther()办法时就是在事务内运行的,那么doOther()办法的执行也退出到已存在的该事务内执行。如果doSome()办法在调用doOther()办法时没有在事务内执行,那么doOther()办法会本人创立一个事务,并在这个新创建的事务中执行。

propagation _requires new :新事务。办法在执行时肯定是新建一个事务,不必他人提供的事务。如果以后曾经存在事务,就将以后事务挂起,晓得新事务执行结束。

propagation _supports :指定的办法反对以后事务,然而如果以后没有事务,也能够执行。就是说,有事务也能够,没事务也行。

propagation_mandatory 、propagation _nested 、propagation _never 、propagation _not _supported 。

(3)提交事务、回滚事务的机会

  • 当业务办法执行胜利,没有异样抛出,当办法执行结束,Spring在办法执行后提交事务。事务管理器commit
  • 当你的业务办法抛出运行时异样或者error,Spring执行回滚,调用事务管理器的rollback运行时异样的定义:RuntimeException和他的子类都是运行时异样,例如NullPointException、NumberFormatException
  • 当你的业务办法抛出非运行时异样,次要是受查异样时,提交事务。受查异样的定义:在你写代码时,必须解决的异样,例如IOException和SQLException。

总结Spring的事务:

  1. 治理事务的是事务管理器及其实现类。
  2. Spring的事务是一个对立治理模型:
  • 指定要应用的事务管理器的实现类,应用xml配置文件中的标签
  • 指定哪些类,哪些办法须要退出事务的性能
  • 指定办法须要的隔离级别,流传行为和超时工夫
    咱们须要通知Spring咱们的我的项目中类信息,办法的名称,办法的事务流传行为。