事物举例
小明去买书,
当他买一本书时需要执行两个操作
假设书的价格是每本50元
一是从书的数量上减1
二是从小明的账户上减去50元
这两个操作数的数量减一和账户上减去50元,是需要同时执行,它们是原子性,即不可分割,要么同时成功提交,要么同时失败后回滚,不可能存在一个成功执行,另一个失败回滚这种状态
事物的总结
事物就是一系列动作,它们被当作单独的一个动作单元,这些动作要么全部完成,要么全部不起作用
事物的四个关键属性(ACID)
原子性(automicity):事物是一个原子操作,有一系列动作组成,事物的原子性要求确保动作要么全部完成要么全部不起作用
一致性(consistency):一旦事物的所有动作完成,事物就会被提交,数据和资源就出于一种满足业务规则的一致性状态中
隔离性(isolation):可能有许多事物处理相同的数据,因此每个事物都应该与其他事物隔离开来,防止数据损害
持久性(durability):一旦事物完成,无论发生什么系统错误,它的结果都不应该收到影响,通过事物的结果被写到持久化存贮器中
======================================
配置声明式事物
配置事物管理器
配置基于注解的事物管理
在需要事物管理的方法上,添加@Trasction注解
前置通知:开启事物
返回通知:提交通知
异常通知:回滚事物
================
try{
开启事物
}catch(){
回滚事物
}finally(
关闭事物
}
=====================================
事物传播属性
当一个事物方法被另一个事物方法调用时,必须指定事物是如何传播的。例如:事物可能在现有的事物中运行,也可能开启一个新的事物,并在自己的事物中运行
在Spring中事物的传播级别一共是6种,例如
=====================================
事物的隔离界别
当同一个应用程序或者或者不同的应用程序中的多个事物在同一个数据集上发生并发执行操作时,可能会出现很多意外情况
并发事物所导致的问题可以分为一下三种类型:
脏读:对于T1和T2两个事物:T1杜去了被T2更新但并未提交的数据,之后,T2发生回滚,T1读取的内容就是临时而且无效的
不可重复读:对于T1和T2两个事物,T1读取了一个数据,T2对数据进行了更新,之后,T1再次对该数据进行读取,得到的同一个数据前后值就不同了
幻读:对于T1和T2两个事物,T1从一个表中读取了一个字段,然后T2对改变增加了一行记录数据,之后,T1对该表再次进行读取,表中的数据就会多出几行
===============================================
从理论上讲,事物应该完全隔离,避免并发事物导致的问题,然后,那样会对性能产生极大的影响,因为事物必须按照顺序进行执行
在实际开发中,为了提高性能,事物经常会以较低的隔离级别运行
事物的隔离级别通过事物的隔离属性进行
未检查异常就是运行时异常
检查异常就是编译时异常