当事务处理系统创建事务时,将确保事务有某些特性 也叫ACID特性
ACID就是:原子性(Atomicity )、一致性( Consistency )、隔离性或独立性( Isolation)和持久性(Durabilily)
原子性:如果事务成功完成 状态全部变更 否则全部回滚,保证系统仍然处于一致状态(有一个逻辑你有2个表一个转账记录表和用户金额表,你去操作一个转账如果其中 一个表操作失败了 用户查询的时候会误会 此时就要用到原子性操作)
一致性:当前操作双方操作处于一致状态(在帐户转换和资金转移前,帐户处于有效状态。如果事务成功地完成,并且提交事务,则帐户处于新的有效的状态。如果事务 出错,终止后,帐户返回到原先的有效状态)
隔离性:交叉事物不会相互干扰
持久性:防止数据丢失则把数据记录存储下来
事务管理用来确保数据的完整性和一致性。
大部分企业解决分布式事务方式都是以一致性
常用的传播属性有7种:propagation
PROPAGATION_REQUIRED:当前方法加入事物,内部嵌套事物失效
PROPAGATION_REQUIRED_NEW:不管是否存在事物都会新建一个事物 外部的挂起内部的执行完再执行外部事物,内部嵌套隔离开不会相互影响提交,外部事物挂起
PROPAGATION_SUPPORTS:上下文事务 如果外部方法有事物则内部方法加入此事物种,如果外部方法没有事物则以无事物方式运行
PROPAGATION_NOT_SUPPORTS:非事物执行,其他事物挂起
事物的隔离级别:isolation
事务的隔离级别多个事务并发运行会诱发3个问题
脏读(a方法update还未提交,b方法select出来的数据还是未提交的原数据)
不可重复读和幻读(1或N事物。多次查询每次读的数据不一致)
不可重复读的重点是修改 :
同样的条件 , 你读取过的数据 , 再次读取出来发现值不一样了
幻读的重点在于新增或者删除同样的条件 , 第 1 次和第 2 次读出来的记录数不一样
解决事务的隔离级别:
READ_UNCOMMITTEND:,不可重复读,幻读,读未提交
READ_COMMITTED : 可以防止脏读(锁定正在读取的行)不可重读,读提交
ISOLATION_REPEATABLE_READ:可以防止脏读,不可重复读 ,会出幻读(锁定所读取的所有行),可重复读
ISOLATION_SERIALIZABLE :最可靠的事务隔离级别三种问题都可以避免但是性能低(锁表),可串行化
设置mysql隔离级别:set global tx_isolation= 级别 (READ UNCOMMITTEND| READ COMMITTEND| REPEATABLE READ | SERIALIZABLE)
事物回滚机制
Transaction内发生unchecked exception(RuntimeException)的时候,会自动rollback,
Transaction内发生checked exception(java语言需要强制catch,抛给调用方来处理)时,是不会自动rollback
不用catch就会自动回滚,如果捕获异常则不会回滚
如果又想捕获异常又想回滚则在catch内加入:TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();