数据库的事务性一直都是程序员所必须掌握的知识,经过这几天的自学,谈谈自己的理解,如有错误望各位大佬指正。
数据库事务是指的对数据进行的一系列操作序列的总称。可以理解为,程序员对数据库进行操作,首先并不会直接在数据库中操作,而是缓存中进行操作,等全部事务操作完后提交,对数据库进行修改,各人感觉有点类似git,svn的操作原理。
数据库事务三大性质:
1.原子性:事务要么全部执行,要么全部失败
2.一致性:事务按照不同的顺序执行,需要得到统一的结果集,即不管先执行A还是B,结果集必须相同
3.隔离性:事务之间应该相互独立,事务之间操作应该是互相部影响的
4.持久性:对于已经提交的事务,数据库必须保证其对数据库的修改成立,即使数据库出现问题
数据库隔离性出现的问题:如脏读,不可重复读,幻读
脏读:读取了事务未提交的操作。
2.不可重复读:多次重复读得出不重复的结果集
和脏读的区别在与:一个是未提交的操作,一个是已经提交的,由于查询完之后这条数据没有锁住,被别的事务更新了,会导致每次读的都是最新数据,这与数据库事务的一致性不符合。
3.幻读:在Repeatable Read隔离级别下,事务A查询或者搜索,事务B 通过插入或者删除,对事务A的结果集进行修改。
spring所有的事务管理策略类都继承自org.springframework.transaction.PlatformTransactionManager接口,TransactionDefinition接口定义了几个常量来表示数据库事务隔离级别:
1.TransactionDefinition.ISOLATION_READ_COMMITTED:该隔离级别表示一个事务只能读取另一个事务已经提交的数据,这个隔离级别是大多数数据库默认使用的隔离级别,可以防止脏读。
2.TransactionDefinition.ISOLATION_READ_UNCOMMITTED:该隔离级别表示可以读取未提交的数据,不可以防止以上三种问题的出现,这种隔离级别由于隔离级别太低,基本用不到
3.TransactionDefinition.ISOLATION_REPEATABLE_READ:该隔离级别可以一个事务多次重复查询,可以防止脏读和不可重复读。
4.TransactionDefinition.ISOLATION_SERIALIZABLE:所有的事务依次逐个执行,这样事务之间就完全不可能产生干扰,也就是说,该级别可以防止脏读、不可重复读以及幻读。但是这将严重影响程序的性能。通常情况下也不会用到该级别。
事务传播行为
所谓事务的传播行为是指,如果在开始当前事务之前,一个事务上下文已经存在,此时有若干选项可以指定一个事务性方法的执行行为。在TransactionDefinition定义中包括了如下几个表示传播行为的常量:
1.TransactionDefinition.PROPAGATION_REQUIRED:如果当前存在事务,则加入该事务;如果当前没有事务,则创建一个新的事务。这是默认值。
2.TransactionDefinition.PROPAGATION_REQUIRES_NEW:创建一个新的事务,如果当前存在事务,则把当前事务挂起。
3.TransactionDefinition.PROPAGATION_SUPPORTS:如果当前存在事务,则加入该事务;如果当前没有事务,则以非事务的方式继续运行。
4.TransactionDefinition.PROPAGATION_NOT_SUPPORTED:以非事务方式运行,如果当前存在事务,则把当前事务挂起。
5.TransactionDefinition.PROPAGATION_NEVER:以非事务方式运行,如果当前存在事务,则抛出异常。
6.TransactionDefinition.PROPAGATION_MANDATORY:如果当前存在事务,则加入该事务;如果当前没有事务,则抛出异常。
7.TransactionDefinition.PROPAGATION_NESTED:如果当前存在事务,则创建一个事务作为当前事务的嵌套事务来运行;如果当前没有事务,则该取值等价于TransactionDefinition.PROPAGATION_REQUIRED。
参考至https://blog.csdn.net/TuxedoLinux/article/details/79113843