一、事务的四大特性:
1、原子性
指事务是一个不可分割的工作单位,事务中的操作要么成功,要么都不发生。
2、一致性
指事务前后数据的完整性必须保持一致
3、隔离性
指多个用户并发访问数据库时,一个用户的事务不能被其他用户的事务所干扰,多个并发事务之家数据要相互隔离。
4、持久性
指一个事务一旦被提交,它对数据库中数据的该表就是永久性的,即使数据库发生故障也不应该对其有任何影响。
二、Spring为我们提供了三个高层抽象的几口
1、PlatformTransactionManager(平台事务管理器):提供三个方法
TransactionStatus getTransaction(TransactionDefinition var1) throws TransactionException; void commit(TransactionStatus var1) throws TransactionException; void rollback(TransactionStatus var1) throws TransactionException;
2、TransactionDefinition(事务定义信息,隔离、传播、超时、只读):
传播行为: int PROPAGATION_REQUIRED = 0; int PROPAGATION_SUPPORTS = 1; int PROPAGATION_MANDATORY = 2; int PROPAGATION_REQUIRES_NEW = 3; int PROPAGATION_NOT_SUPPORTED = 4; int PROPAGATION_NEVER = 5; int PROPAGATION_NESTED = 6; 隔离级别: int ISOLATION_DEFAULT = -1; int ISOLATION_READ_UNCOMMITTED = 1; int ISOLATION_READ_COMMITTED = 2; int ISOLATION_REPEATABLE_READ = 4; int ISOLATION_SERIALIZABLE = 8; 超时: int TIMEOUT_DEFAULT = -1;
3、TransactionStatus(事务具体运行状态,获取事务的具体状态):
boolean isNewTransaction(); boolean hasSavepoint(); void setRollbackOnly(); boolean isRollbackOnly(); void flush(); boolean isCompleted();
三、不考虑隔离性,会引发安全问题
1、脏读
2、不可重复读
3、幻读
4、以下就是解决隔离级别的配置
四、事务的传播行为
1、事务的传播行为是解决开发中实际问题的,例如
service1 (业务层,调用dao1,dao2)
xxx1()<---------------------------------------- xxx1Dao()持久层
aaa()
xxx2()<-----------------------------------------xxx2Dao()持久层
service2(业务层,调用dao3,dao4)
xxx3()<---------------------------------------- xxx3Dao()持久层
bbb()
xxx4()<-----------------------------------------xxx4Dao()持久层
出现复杂的情况:
同时调用service1.aaa() 和 service2.bbb()方法才能完成一个业务员;假如aaa()有事务,bbb()有事务,那么应该 调用哪个事务呢?
2、传播行为分三类:
上图每个画大红圈的是三种分类,
1、如果aaa()有事务,那么aaa()和bbb()都用aaa()的事务,如果aaa()事务不存在,那么bbb()就创建一个事务把 aaa() 的内容包裹起来执行一个事务;
2、如果aaa()有事务,那么aaa()和bbb()都用aaa()的事务,如果aaa()事务不存在,那么bbb()就不使用事务;
3、如果aaa()有事务,那么aaa()和bbb()都用aaa()的事务,如果aaa()事务不存在,那么就抛出异常;
4、如果aaa()有事务,那么aaa()事务挂起不使用了;aaa()和bbb()不在一个事务,那么新建一个事务放在一起;
5、如果aaa()有事务,那么aaa()事务挂起不使用了;
6、有事务就抛出异常
7、aaa()执行完了标记一个保存点,如果bbb()执行失败,那么可以回复到aaa()保存完的那个执行点,也可以回复到最初状态。