springboot mysql事物_SpringBoot事务详细简介[通俗易懂]

springboot mysql事物_SpringBoot事务详细简介[通俗易懂]重要概念自动提交模式对于mysql数据库,默认情况下,数据库处于自动提交模式。每一条语句处于一个单独的事务中,在这条语句执行完毕时,如果执行成功则隐式的提交事务,如果执行失败则隐式的回滚事务。对于正常的事务管理,是一组相关的操作处于一个事务之中,因此必须关闭数据库的自动提交模式,下面是查看方式:查看是否自动提交命令(ON表示开启自动提交,值为1,OFF表示关闭自动提交,值为0):showvari…

大家好,又见面了,我是你们的朋友全栈君。

重要概念

自动提交模式

对于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相关问题请访问PHP中文网:Mysql视频教程

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/135449.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 静态方法只能通过类名进行调用_java非静态方法可以调用静态方法吗

    静态方法只能通过类名进行调用_java非静态方法可以调用静态方法吗静态方法调用的三种方式:1、newxx().静态();//使用对象调用,不推荐2、xx.静态();//类名调用,正规调用方法,推荐3、静态();//本类的静态方法在本类调用,直接调用欢迎各位在评论区留言探讨…

    2022年10月28日
  • 网学天地考研资料分享_零极区块链怎么赚钱

    网学天地考研资料分享_零极区块链怎么赚钱孤荷凌寒自学第189天区块链103天Dapp058【主要内容】今天继续学习实战,终于完全实现一个波菜类的猜大小的智能合约,并开始准备了解erc721合约标准。共耗时26分钟。(此外整理作笔记花费

    2022年8月5日
  • IDEA 2021 mybatis log plugin 激活【2021免费激活】

    (IDEA 2021 mybatis log plugin 激活)这是一篇idea技术相关文章,由全栈君为大家提供,主要知识点是关于2021JetBrains全家桶永久激活码的内容IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.net/100143.html1435QFILVV-eyJsa…

    2022年3月30日
  • linux系统查看版本命令,Linux系统查看系统版本命令[通俗易懂]

    linux系统查看版本命令,Linux系统查看系统版本命令[通俗易懂]以下操作在centos系统上实现,有些方式可能只适用centos/redhat版本系统uname-a|uname-r查看内核版本信息[root@node1~]#uname-aLinuxnode12.6.32-573.el6.x86_64#1SMPThuJul2315:44:03UTC2015x86_64x86_64x86_64GNU/Linux[root@n…

    2022年8月21日
  • 红色故障码大全_最短路问题算法

    红色故障码大全_最短路问题算法原题链接战争中保持各个城市间的连通性非常重要。本题要求你编写一个报警程序,当失去一个城市导致国家被分裂为多个无法连通的区域时,就发出红色警报。注意:若该国本来就不完全连通,是分裂的k个区域,而失去一个城市并不改变其他城市之间的连通性,则不要发出警报。输入格式:输入在第一行给出两个整数N(0 < N ≤ 500)和M(≤ 5000),分别为城市个数(于是默认城市从0到N-1编号)和连接两城市的通路条数。随后M行,每行给出一条通路所连接的两个城市的编号,其间以1个空格分隔。在城市信息之后给出被攻占的

    2022年8月8日
  • nonblock recvfrom

    nonblock recvfromif(-1==fcntl(iSocketfd,F_SETFL,O_NONBLOCK)){ printf(“fcntlsocketerror!\n”); return-1;}intiSocketLen=sizeof(structsockaddr_in);/*setrecvfromfromservertimeout*/structti

    2022年7月23日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号