Transactional详细信息

Transactional能入的值

  1. isolation:事务的隔离级别
  2. propagation:事务的传播行为
  3. noRollbackFor:哪些异常事务可以不回滚(输入类型)
  4. noRollbackForClassName:哪些异常事务可以不回滚(输入全类名)
  5. rollbackFor:哪些异常事务需要回滚(输入类型)
  6. rollbackForClassName:哪些异常事务需要回滚(输入全类名)
  7. readOnly:设置事务只读 (默认为false)这个属性只能够使用在查询sql中。
  8. timeout:事务超出指定时间后进行回滚(以秒为单位)

此文章就展示项目架构了项目架构请看此文章

案例

timeout 案例
Transactional详细信息
错误提示
Transactional详细信息
readOnly 案例
Transactional详细信息
错误提示
PreparedStatementCallback; SQL [update balance set price = price - ? where name= ?]; Connection is read-only. Queries leading to data modification are not allowed; nested exception is java.sql.SQLException: Connection is read-only. Queries leading to data modification are not allowed

Transactional详细信息
连接是只读的,不允许导致数据修改的查询(修改语句不容许设置为只读)

noRollbackFor 案例
异常分为运行时异常(非检查时异常)和编译时异常(检查时异常)

spring事务中默认行为为运行时异常回滚,编译时异常不回滚
原数据
Transactional详细信息
运行时异常
Transactional详细信息
数据
Transactional详细信息
编译时异常
Transactional详细信息
数据并没有回滚,证明spring事务中默认编译期事务不回滚
Transactional详细信息
设置算术异常不回滚
Transactional详细信息
数据
Transactional详细信息
发现数据并没有回滚 ,zs 已经扣钱了 ,ls没有加到钱

rollbackFor案例
Transactional详细信息
数据还是不变
Transactional详细信息
注意点:rollbackFor设置异常回滚的时候 ,异常不要try - catch掉, try - catch掉的异常事务还是不会进行回滚操作。

isolation
具体的数据库隔离级别请看此文章 隔离级别连接
设置隔离级别
Transactional详细信息
四种取值
DEFAULT:默认 和当前数据库有关,Oracle默认读已提交,MySQL默认可重复读。
READ_COMMITTED:读已提交
READ_UNCOMMITTED:读未提交
REPEATABLE_READ:可重复读
SERIALIZABLE:串行化

propagation
propagation 事务的传播行为 ,什么是事务的传播行为 ,比如有一个方法a,方法a调用了方法b,其中方法a自己有事务控制,而方法b也有自己的事务,那么方法b使用的事务是谁的,是自己本身,还是a方法的事务,这就是事务的传播行为。

spring提供了七种事务的传播行为
Transactional详细信息

  1. MANDATORY:当前的方法必须运行在事务内部,如果没有正在运行的事务,就抛出异常

  2. NESTED:如果有事务在运行,当前的方法就应该在这个事务的嵌套事务内运行,否则,就启动一个新的事务,并在它自己的事务内运行

  3. NEVER:当前的方法不应该运行在事务中。如果有运行的事务,就抛出异常

  4. NOT_SUPPORTED:当前的方法不应该运行在事务中。 如果有运行的事务,将它挂起

  5. REQUIRED:如果有事务在运行,当前的方法就在这个事务内运行,否则,就启动一个新的事务,并在自己的事务内运行

  6. REQUIRES_NEW:当前的方法必须启动新事务,并在它自己的事务内运行.如果有事务正在运行,应该将它挂起

  7. SUPPORTS:如果有事务在运行当前的方法就在这个事务内运行,否则它可以不运行在事务中.