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


相关推荐

  • 建索引的优缺点

    建索引的优缺点参考:https://blog.csdn.net/ybaog/article/details/53906300为什么要创建索引呢?这是因为,创建索引可以大大提高系统的性能。第一,通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。第二,可以大大加快数据的检索速度,这也是创建索引的最主要的原因。第三,可以加速表和表之间的连接,特别是在实现数据的参考完整性方面特别有意义。…

    2022年5月10日
    42
  • realme gt neo刷鸿蒙(realmegt大师探索版值得入手吗)

    realme真我GTNeo于上月31日举行了发布会,于4月8日零点正式开售。realmeGTNeo首发搭载天玑1200旗舰芯片、120Hz电竞屏等,12GB+256GB版本仅售2299元。天玑1200性能强劲,真我GTNeo可谓是两千元档最强性能旗舰手机,学生党入手也毫无压力。本次真我GTNeo瞄准年轻市场,专为Z世代量身打造。在外观上,GTNeo推出了最终幻想、骇客黑与极客…

    2022年4月15日
    251
  • Linux文件的rwx含义,文件(目录)rwx权限的意义[通俗易懂]

    Linux文件的rwx含义,文件(目录)rwx权限的意义[通俗易懂]我们知道不同的角色针对同一个文件(目录)可能会有不同的权限,那么rwx权限的意义是什么呢?对于文件文件是包含实际数据的地方,包括一般文本文件、数据库内容文件、二进制可执行文件等。对于文件来说,rwx权限的意义为:r:read,可读取此文件的内容,即可以打开文件;w:write,可编辑此文件的内容,如可以增加、删除、更改文件内容;x:execute,可以执行此文件。需要注意的是,文件的权限rwx都是…

    2022年5月20日
    89
  • 写一个 docker 打击一系列手册

    写一个 docker 打击一系列手册

    2022年1月2日
    36
  • SpringCloud—-如何解决灾难性雪崩效应

    SpringCloud—-如何解决灾难性雪崩效应

    2020年11月12日
    229
  • ASP.NET MVC4开发指南_安装.net framework

    ASP.NET MVC4开发指南_安装.net framework安装AspNetMVC1-RC2出错,错误提示如下:MicrosoftASP.NETMVC1.0RC2SetupWizardendedprematurelyMicrosoftASP.NETMVC1.0RC2SetupWizardendedprematurelybecauseofanerror.Yoursystemhasnotbee…

    2022年9月29日
    3

发表回复

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

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