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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 计算机视觉–光流法(optical flow)简介[通俗易懂]

    计算机视觉–光流法(optical flow)简介[通俗易懂]光流法理论背景1.什么是光流光流(opticalflow)是空间运动物体在观察成像平面上的像素运动的瞬时速度。光流法是利用图像序列中像素在时间域上的变化以及相邻帧之间的相关性来找到上一帧跟当前帧之间存在的对应关系,从而计算出相邻帧之间物体的运动信息的一种方法。通常将二维图像平面特定坐标点上的灰度瞬时变化率定义为光流矢量。一言以概之:所谓光流就是瞬时速率,在时间间隔很小(…

    2022年7月23日
    23
  • C语言:十进制、十六进制数据互换

    C语言:十进制、十六进制数据互换最近写单片机数据转换用到了十进制 十六进制互换 将示例 Demo 分享给各位朋友

    2025年9月6日
    2
  • 中国国家航天局:探月工程四期还有三次任务「建议收藏」

    中国国家航天局:探月工程四期还有三次任务「建议收藏」中国国家航天局:探月工程四期还有三次任务

    2022年4月21日
    56
  • HTML+CSS实战(一)——导航条菜单的制作

    HTML+CSS实战(一)——导航条菜单的制作一、垂直导航菜单的制作1、基本的样式清除:*{margin:0;padding:0}2、无序列表圆点去除:ul{list-style:none}3、下划线去除:a{text-decoration:none}4、文本缩进标签text-indent不会影响总体宽度(padding会)5、使用行高line-height可以实现文字默认居中,前提是行高和width相等。6、

    2022年7月22日
    10
  • datagrip激活码mac【2021.10最新】

    (datagrip激活码mac)本文适用于JetBrains家族所有ide,包括IntelliJidea,phpstorm,webstorm,pycharm,datagrip等。https://javaforall.net/100143.htmlIntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,上面是详细链接哦~1…

    2022年3月27日
    57
  • 树莓派新手教程_新手入门树莓派必做的四件事

    树莓派新手教程_新手入门树莓派必做的四件事此篇文章獻給所有第一次把玩樹莓派的新手、以及樹莓派的愛好者。 ByHerbfargus-Ownwork,CCBY-SA4.0,https://commons.wikimedia.org/w/index.php?curid=47497384 目標建立一個省電的家用伺服器 小弟選用樹莓派作為家用伺服器,…

    2022年10月14日
    2

发表回复

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

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