事务
定义
多个指定的操作单元组成的合集,多个单元操作是整体不可分割的,要么操作成功,要么都不成功。
四个原则ACID
- Atomicity原子性 事务是不可分割的最小单位,事务内的操作要么全成功(commit),要么一个失败全部失败(rollback)。
- Consistency一致性 在事务执行前,数据库的数据处于正确的状态,而事务执行完成后。数据库的数据还应该是处于正确的状态,即数据完整性约束没有被破坏。
- Isolation隔离性 并发事务执行之间互不影响,在一个事务内部的操作对其他事务是不会产生影响的,这个需要事务隔离级别来指定隔离性。
DEFAULT 使用数据库设置的隔离级别(默认),由DBA默认的设置来决定隔离级别 READ_UNCOMMITTED 事务最低的隔离级别,允许别外一个事务可以拿到这个事务未提交的数据。这种隔离级别会出现脏读、不可重复读和幻读。 READ_COMMITED 保证一个事务修改的数据提交后才能被另一个事务读取。另一个事务不能读取改事务未提交的数据。这种事务隔离级别可以避免脏读出现,但是可能会出现不可重复读和幻读。 REPEATABLE_READ 保证一个事务不能读取另一个事务未提交的数据。这种事务隔离级别可以防止脏读、不可重复读,但是可能出现幻读。 SERIALIZABLE 事务被处理为顺序执行,防止脏读、重复读和避免幻读。级别最高,花费代价最高,但最可靠。
- Durability持久性 事务一旦执行成功,它对数据库的数据的改变必须是永久的,不会因比如遇到系统故障或断电造成数据不一致或丢失。
事务分类
数据库事务
- 本地事务 普通事务,独立一个数据库,能保证在改数据库上操作的ACID
- 全局事务(分布式事务) 设计两个或多个数据源的事务,及跨越多台同类或异类数据库的事务(由每台数据库的本地事务组成),旨在保证这些本地事务的所有操作的ACID,是事务可以跨越多台数据库。
java事务
- JDBC事务 即数据库事务中的本地事务,通过connection对象控制管理
- JTA(java transaction api)事务 java事务api,是java ee数据库事务规范,只提供事务管理接口,由应用程序服务器厂商提供实现。jta事务比jdbc强大,支持分布式事务。
编程式事务和声明式事务
- 编程式事务 通过代码在业务执行是根据需要自行实现事务的commit和rollback,粒度更小,可用在代码块上。不可复用,重复的代码太多。
- 声明式编程 繁琐的有xml配置,简单粗暴的额直接使用@Transactional注解实现。