自动提交形式
关于mysql数据库,默许情况下,数据库处于自动提交形式。每一条语句处于一个零丁的事件中,在这条语句实行终了时,假如实行胜利则隐式的提交事件,假如实行失利则隐式的回滚事件。关于一般的事件管理,是一组相干的操纵处于一个事件当中,因而必需封闭数据库的自动提交形式,下面是检察体式格局:
检察是不是自动提交敕令(ON示意开启自动提交,值为1,OFF示意封闭自动提交,值为0):
show variables like 'autocommit';
封闭自动提交后,则用户将一向处于某个事件中,直到实行一条commit提交或rollback语句才会完毕当前事件重新最先一个新的事件。
DataSource connection = masterDataSource.getConnection(); connection.setAutoCommit(false);
事件断绝级别
断绝级别是指多少个并发的事件之间的断绝水平。TransactionDefinition 接口中定义了五个示意断绝级别的常量:
1、TransactionDefinition.ISOLATION_DEFAULT
:这是默许值,示意运用底层数据库的默许断绝级别。对大部份数据库而言,一般这值就是TransactionDefinition.ISOLATION_READ_COMMITTED
。
2、TransactionDefinition.ISOLATION_READ_UNCOMMITTED
:该断绝级别示意一个事件能够读取另一个事件修正但还没有提交的数据。该级别不能防备脏读,不可反复读和幻读,因而很少运用该断绝级别。比方PostgreSQL实际上并没有此级别。
3、TransactionDefinition.ISOLATION_READ_COMMITTED
:该断绝级别示意一个事件只能读取另一个事件已提交的数据。该级别能够防备脏读,这也是大多数情况下的推荐值。
4、TransactionDefinition.ISOLATION_REPEATABLE_READ
:该断绝级别示意一个事件在悉数过程当中能够屡次反复实行某个查询,而且每次返回的纪录都雷同。该级别能够防备脏读和不可反复读。
5、TransactionDefinition.ISOLATION_SERIALIZABLE
:一切的事件顺次逐一实行,如许事件之间就完整不可能发生滋扰,也就是说,该级别能够防备脏读、不可反复读以及幻读。然则这将严重影响顺序的机能。一般情况下也不会用到该级别。
事件流传行动
所谓事件的流传行动是指,假如在最先当前事件之前,一个事件上下文已存在,此时有多少选项能够指定一个事件性要领的实行行动。在TransactionDefinition定义中包含了以下几个示意流传行动的常量:
1、TransactionDefinition.PROPAGATION_REQUIRED
:假如当前存在事件,则到场该事件;假如当前没有事件,则建立一个新的事件。这是默许值。
2、TransactionDefinition.PROPAGATION_REQUIRES_NEW
:建立一个新的事件,假如当前存在事件,则把当前事件挂起。
3、TransactionDefinition.PROPAGATION_SUPPORTS
:假如当前存在事件,则到场该事件;假如当前没有事件,则以非事件的体式格局继承运转。
4、TransactionDefinition.PROPAGATION_NOT_SUPPORTED
:以非事件体式格局运转,假如当前存在事件,则把当前事件挂起。
5、TransactionDefinition.PROPAGATION_NEVER
:以非事件体式格局运转,假如当前存在事件,则抛出非常。
6、TransactionDefinition.PROPAGATION_MANDATORY
:假如当前存在事件,则到场该事件;假如当前没有事件,则抛出非常。
7、TransactionDefinition.PROPAGATION_NESTED
:假如当前存在事件,则建立一个事件作为当前事件的嵌套事件来运转;假如当前没有事件,则该取值等价于TransactionDefinition.PROPAGATION_REQUIRED
。
庇护点(Savepoints
)
起首要知道savepoint就是为回退做的,savepoint的个数没有限定,savepoint和虚拟机中快照相似. savepoint是事件中的一点。用于作废部份事件,当完毕事件时,会自动的删除该事件中所定义的一切保留点。
当实行rollback时,经由过程指定保留点能够回退到指定的点。
回退事件的几个主要操纵
1、设置保留点 savepoint a
2、作废保留点a以后事件 rollback to a
3、作废悉数事件 rollback
注重:这个回退事件,必需是没有commit前运用的;
public class UserRepository { private DataSource masterDataSource; private Connection connection = null; @Autowired public void setMasterDataSource(DataSource masterDataSource) { this.masterDataSource = masterDataSource; } @Transactional public boolean save(User user) { try { connection = masterDataSource.getConnection(); connection.setAutoCommit(false); //设置庇护点 Savepoint saveUser = connection.setSavepoint("saveUser"); PreparedStatement prepareStatement = connection.prepareStatement("insert into user(id,name,age) values(?,?,?)"); prepareStatement.setLong(1, user.getId()); prepareStatement.setString(2, user.getName()); prepareStatement.setInt(3, user.getAge()); prepareStatement.execute(); try { update(user); } catch (Exception e) { System.out.println("出错了。。"+e); //回滚至庇护点 connection.rollback(saveUser); } connection.commit(); } catch (SQLException e) { e.printStackTrace(); } finally { try { connection.close(); } catch (SQLException e) { e.printStackTrace(); } } return true; } public boolean update(User user) { System.out.println("save user:"+user); try { PreparedStatement prepareStatement = connection.prepareStatement("update user set name = ? ,age = ? where id = ?)"); prepareStatement.setLong(3, user.getId()); prepareStatement.setString(1, "王大拿"); prepareStatement.setInt(2, 100/0); prepareStatement.execute(); connection.commit(); } catch (SQLException e) { e.printStackTrace(); } return true; } }
以上内容整顿如有毛病请斧正,感谢!
更多Mysql相干题目请接见ki4网:Mysql视频教程
以上就是SpringBoot事件细致简介的细致内容,更多请关注ki4网别的相干文章!