Spring的事务管理默认是针对unchecked exception回滚
即针对RuntimeException()异常极其子类回滚
事务回滚的实验
即针对RuntimeException()异常极其子类回滚
事务回滚的实验
- 1.参照的标准无回滚事务流程
@Service @Transactional public class StuService_dbcp implements StuService_dbcpIntf { |
看结果: 4:clair 2:testTran128504319 |
- 2.加入RuntimeException的标准回滚事务流程
@Service @Transactional public class StuService_dbcp implements StuService_dbcpIntf { |
结果: java.lang.ArithmeticException: / by zero 4:clair 2:testTran128504319 |
- 3.抛出一个自定义的Runtime异常,也能引起spring 事务回滚
@Service @Transactional public class StuService_dbcp implements StuService_dbcpIntf { } |
运行: java.lang.RuntimeException: 运行期异常 unchecked异常 4:clair 2:testTran128504319 |
- 4.抛出一个普通异常(例子中是一个普通的IO异常),不会引起spring 事务回滚,事务正常执行完成(尽管期间发生了异常,数据可能是无效数据)
@Service @Transactional public class StuService_dbcp implements StuService_dbcpIntf { |
java.io.FileNotFoundException: d:\,,jjygfsjhkghsdfsadf (系统找不到指定的文件。) 4:clair 2:testTran128504319 3:testTran1895510505 |
- 5.还是上例,虽然抛出一个普通IO异常,但通过(rollbackFor=Exception.class),设置所有checked异常也回滚
|
执行: java.io.FileNotFoundException: d:\,,jjygfsjhkghsdfsadf (系统找不到指定的文件。) 4:clair 2:testTran128504319 |
- 6.上面是把(rollbackFor=Exception.class)设在方法上,现在设到整个Class 上
@Service @Transactional(rollbackFor=Exception.class) public class StuService_dbcp implements StuService_dbcpIntf { |
执行: java.io.FileNotFoundException: d:\,,jjygfsjhkghsdfsadf (系统找不到指定的文件。) 4:clair 2:testTran128504319 |
- 7.以上例子,在ORACLE上测试通过,但在mysql上测试没通过
java.lang.ArithmeticException: / by zero 1:sily 2:testTran1651919412 3:testTran-233915713 |
原因:MyISAM engine支持事务很差 |
- 8.改成在mysql innoDB Engine上测试通过:
mysql> drop table stu; Query OK, 0 rows affected (0.00 sec) mysql> Query OK, 0 rows affected (0.02 sec) 插入一个新纪录:0:sily 执行: |
看结果: java.lang.ArithmeticException: / by zero 0:sily |