共计 3355 个字符,预计需要花费 9 分钟才能阅读完成。
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 个真正有效值:
- read _uncommitted: 读未提交。未解决任何并发问题。
- read _commited: 读已提交。解决脏读,存在不可反复读和幻读。
- repeatable_read: 可反复读。解决脏读和不可反复读,存在幻读。
- 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 的事务:
- 治理事务的是事务管理器及其实现类。
- Spring 的事务是一个对立治理模型:
- 指定要应用的事务管理器的实现类,应用 xml 配置文件中的标签
- 指定哪些类,哪些办法须要退出事务的性能
- 指定办法须要的隔离级别,流传行为和超时工夫
咱们须要通知 Spring 咱们的我的项目中类信息,办法的名称,办法的事务流传行为。