Spring事务原理 @Transactional原理

数据库事务:

我们如果要探讨Spring事务原理,那我们首先得明白什么是数据库事务,数据库事务有什么特性;

数据库事务:是由一组sql语句组成的逻辑处理单元; (说白了- 多条语句作为一个整体 进行操作的功能;

也就是说 A表新增一条记录,B表就要插入一条日志, 这两个操作是一个整体,事务可以保证 这两个sql要么都执行成功也就是都插入数据,要么都不执行也就是都不插入数据)

事务可以保证该事务下的所有操作也就是sql执行 要么都成功,要么都不成功

事务特性:具有4个属性,通常简称为事务的ACID属性;

  • A:Atomicity,原子性,将所有SQL作为原子工作单元执行,原子在化学中,是最小单位,不可以再分割了.事务必须是原子工作单元,对于其数据修改,要么全都执行,要么全都不执行。(commit/rollback)
  • C:Consistency,一致性,事务完成后,所有数据的状态都是一致的,即A账户只要减去了100,B账户则必定加上了100;
  • I:Isolation,隔离性,如果有多个事务并发执行,每个事务作出的修改必须与其他事务隔离;并发执行的各个事务之间不能互相干扰。
  • D:Durability,持久性是指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来的其他操作和数据库故障不应该对其有任何影响,该修改即使出现系统故障也将一直保持。

上面我们了解了数据库事务原理,我们下面就来了解在数据库里面怎么使用

事务声明

隐式事务:我们使用的数据库连接工具对于单条SQL语句会自动将其作为一个事务帮我们提交,这种事务被称为

显式事务:要手动把多条SQL语句作为一个事务执行,

使用BEGIN开启一个事务,

使用COMMIT提交一个事务,

使用ROLLBACK回滚事务,整个事务会失败(不会对数据进行修改

BEGIN
    insert ....
    update ....
COMMIT/ROLLBACK

上面我们了解了数据库事务,下面我们就来了解在spring中如何使用事务

spring中使用事务 

要了解spring中使用事务,我们首先要知道jdbc怎么操作事务的

jdbc中使用事务:

注意:JDBC对事务的处理规则,必须是基于同一个Connection,也就是保证是同一个连接Connection,才可以做事务控制

JDBC提供了3个方法来进行事务管理

  • setAutoCommit() 设置自动提交,方法中需要传入一个boolean类型的参数,true为自动提交,false为手动提交

  • commit() 提交事务

  • rollback() 回滚事务

    static  Connection getConnect() throws Exception{
        Class.forName("com.mysql.jdbc.Driver");
        return DriverManager.getConnection("jdbc:mysql://localhost:3306/mysql?characterEncoding=utf-8","root", "root");
    }

    static void connect() throws SQLException {
        Connection connection = null;
        try {
            connection = getConnect(); //获取一个连接Connection
            /**
             * 默认都是自动提交,包括我们的一些查询工具,都是默认帮我们提交的
             */
            connection.setAutoCommit(false);//关闭自动提交

            Statement statement = connection.createStatement();
            //业务处理  
            statement.execute("insert into my_user values(4,'jack',28);");
            statement.execute("insert into my_user values(5,'tonny',28);");

            int i = 1/0; //这里抛异常,比如我们执行日志的时候可能报错,我们就要回滚数据。            
                          //所以事务回滚,

            connection.commit(); //事务提交,以上的操作都会执行

        } catch (Exception e) {
            e.printStackTrace();
            try {
                connection.rollback(); //事务回滚,就不会执行插入语句
            } catch (SQLException ex) {
                ex.printStackTrace();
            }
        }
    }

会继续更新奥.........................................................................................................................🙂

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值