事务

落花浮王杯 提交于 2019-12-03 07:15:40

什么是事务

​ 事务是指逻辑上的一组操作,这种操作要么全部发生(提交成功),要么全部失败(回滚)。

举例 : 张三李四 进行 转账的操作

​ 张三向转账李四 1000元 张三余额-1000元 李四余额+1000元

​ 不应该出现的是 在转账过程中由于一些意外,使张三的余额减去了1000元, 而李四并没有收到这笔钱。 使 用事务来进行管理。 必须全部成功(张三扣款,李四收款)或者一起失败(张三李四存款不变)。

事务的四大特性(ACID):

​ 原子性(Atomicity):是指事务一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。 不能够单独运行。把一组操作放入事务中。

​ 一致性(Consistency):事务执行的前后,数据的完整性要得到保证。

​ 隔离性(Isolation):多个用户并发访问数据库的时候,一个用户的事务不会被其他用户的事务干扰,多个并发事务之间的数据要相互隔离。解决多个用户对同一个数据进行操作,数据库会有事务的隔离级别来解决。

​ 持久性(Durability):一个事务一旦被提交,它对数据库中数据的的改变是永久性,即使数据库发生故障也不应该对其有影响。

并发访问问题----由隔离性引起 :

1.脏读:

​ 指一个事务正在访问数据,并对其进行了修改,且未提交到数据库中。这时候另一个数据也访问这个数据,然后使用这个数据。因为这个数据是还未提交的数据,那么另一个事务读到的这个数据就是脏数据,依据脏数据进行的操作可能是不正确的

2.不可重复读:

​ 指一个事务内,多次重复读取同一数据。在这个事务还未结束的时候,另一个事务也访问了该数据,并对其进行了修改,那么第一个事务两次读取的数据可能不一样,成为不可重复读。

3.幻觉读:

​ 是指事务不独立执行时的一种现象。例:第一个事务对表中的数据进行了修改,这种修改涉及到表中的全部数据行。同时,第二个事务也对表进行修改,向表中插入一行新的数据。结果就是第一个事务的用户发现表中居然还有没被修改的数据,就好像发生了幻觉一样[非洲脸]。

事务的隔离级别:

  1. read uncommited:读取未提交的数据:哪个问题都不能解决。
  2. read commited:读取已提交的数据:可以解决脏读,oracle默认的级别。
  3. repeatable read:重读读取: 可以解决脏读和不可重复读,mysql默认的级别。
  4. serializable:串行化: 可以解决脏读、不可重复读、幻觉读,相当于锁表。

java事务主要有两种:jdbc事务(本地事务),jta (java tranaction api)事务(分布式事务)

一、JDBC事务操作:

  1. jdbc默认的是自动事务,执行slq语句,executeUpdate() ---- 每执行一次executeUpdate方法 代表 事务自动提交。

  2. jdbc的API手动事务:

    (1) 开启事务:conn.setAutoCommit(false) //关闭自动提交,开启收到提交;

    (2) 提交事务:coon.commit();

    (3) 回滚事务:coon.rollback();

    注意:控制事务的connnection必须是同一个

    执行sql的connection与开启事务的connnection必须是同一个才能对事务进行控制

    //通过jdbc去控制事务
            Connection conn = null;
            //1、注册驱动
            try {
                Class.forName("com.mysql.jdbc.Driver");
                //2、获得connection
                conn = DriverManager.getConnection("jdbc:mysql:///web19", "root", "root");
    
                //手动开启事务,先声明不自动提交
                conn.setAutoCommit(false);
    
                //3、获得执行平台
                Statement stmt = conn.createStatement();
    
                //4、操作sql
                stmt.executeUpdate("update account set money=5000 where name='tom'");
    
    
                //提交事务
                conn.commit();
    
                stmt.close();
                conn.close();
            } catch (Exception e) {
                try {
                    conn.rollback();
                } catch (SQLException e1) {
                    e1.printStackTrace();
                }
                e.printStackTrace();
            }

二、 框架事务

框架中事务一般交由Spring处理。Spring配置事务的方式有两种,一种是声明式事务,另一种是注解式事务。

​ 注解事务:在Spring配置文件中加入,然后在需要的方法上加入@Transaction注解.

​ 分布式事务:切点一般是扫描service层实现类,通过实现类配置传播特性,决定哪些方法上加事务,哪些方法上不要加事务。

事务主要有五大隔离级别和7种传播特性;五大隔离级别由低到高:主要控制是否出现脏读,不可重复读和幻觉读;7种传播特性主要决定是新建事务,还是取当前事务;

参考链接: https://blog.csdn.net/LVXIANGAN/article/details/85329630

参考链接: https://blog.csdn.net/toby1123yjh/article/details/79941788

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!