Spring的事务管理
admin
2023-05-23 16:02:37
0

一、事务的基础知识

  1. 数据库事务:复杂的事务要分步执行,要么整体生效、要么整体失效。

  2. 必须满足:原子性、一致性、隔离性、持久性。

  3. 数据并发问题:脏读:A读取了B未提交的更改数据。

             不可重复读:A两次读,第二次读到了B已经提交的数据。(行级锁)

             幻读(虚读):A读取B新提交的新增数据。(需添加表级锁)

             第一类丢失更新:A撤销时恢复原数据把B提交的数据覆盖了。

             第二类丢失更新:A提交时覆盖了B已经提交的数据。

  4. 数据库锁机制:一般分为表锁和行锁,按并发来分有共享锁和独占锁。数据库必须在更改的行上施加独占锁;行共享锁、行独占锁、表共享锁、表共享行独占锁、表独占锁。

  5. 事务隔离级别:

Spring的事务管理


6.JDBC对事务的支持


二、ThreadLocal

  1. 概念:ThreadLocal是保存线程本地化的容器,为每个使用该变量的线程分配一个独立的变量副本。

  2. 原理:通过Map来保存每个线程的变量副本,key为线程对象,值为线程的副本。

public class TestNum {  
    // ①通过匿名内部类覆盖ThreadLocal的initialValue()方法,指定初始值  
    private static ThreadLocal seqNum = new ThreadLocal() {  
        public Integer initialValue() {  
            return 0;  
        }  
    };  
  
    // ②获取下一个序列值  
    public int getNextNum() {  
        seqNum.set(seqNum.get() + 1);  
        return seqNum.get();  
    }  
  
    public static void main(String[] args) {  
        TestNum sn = new TestNum();  
        // ③ 3个线程共享sn,各自产生序列号  
        TestClient t1 = new TestClient(sn);  
        TestClient t2 = new TestClient(sn);  
        TestClient t3 = new TestClient(sn);  
        t1.start();  
        t2.start();  
        t3.start();  
    }  
  
    private static class TestClient extends Thread {  
        private TestNum sn;  
  
        public TestClient(TestNum sn) {  
            this.sn = sn;  
        }  
  
        public void run() {  
            for (int i = 0; i < 3; i++) {  
                // ④每个线程打出3个序列值  
                System.out.println("thread[" + Thread.currentThread().getName() + "] --> sn["  
                         + sn.getNextNum() + "]");  
            }  
        }  
    }  
}

在spring中大部分Bean都可以声明为singleton,故而spring要对这些非线程安全bean采用Threadlocal进行封装,这样有状态的bean就能够以sigleton的方式在多线程中正常工作。spring通过Threadlocal来实现事务管理


三、spring对事务的支持

  1. spring封装了事务模版类TranscationTemplate.


  2. 事务管理主要有3个接口:PlatformTransactionManager,TransactionDefinition,TransactionStatus.

TransactionDefinition:用于描述事务的隔离级别、超时时间、等事务属性;

PlatformTransactionManager根据TransactionDefinition提供的事务属性来创建事务;就三个方法getTransaction、commit、rollback;

TransactionStatus描述激活事务的状态;


3.spring把事务管理委托给底层具体的持久化实现框架来完成,为不同的持久化框架提供了不同的PlatformTransactionManager接口的实现类。


      3)引用数据源

Hibernate

1)Hibernate配置


    
        
        com.mysql.jdbc.Driver
        
        jdbc:mysql://localhost/hibernate_test
        
        root
        
        cheng
        
        20
        
        1
        
        5000
        
        100
        3000
        2
        true
        
        org.hibernate.dialect.MySQL5InnoDBDialect
        
        update
        
        true
        
        true
        
        false
        
        
        
    

hibernate.cfg.xml文件的主要作用就是配置了一个session-factory

  1. 在session-factory中主要通过property配置一些数据库的连接信息,我们知道,spring通常会将这种数据库连接用dataSource来表示,这样一来,hibernate.cfg.xml文件中的所有跟数据库连接的都可以干掉了,直接用spring的dataSource,而dataSource也可以用c3p0、dbcp等。

  2. 在session-factory中通过property除了配置一些数据库的连接信息之外,还有一些hibernate的配置,比如方言、自动创建表机制、格式化sql等,这些信息也需要配置起来。

  3. 还有最关键的一个持久化类所在路径的配置

2)spring的sessionFactroy配置


    

    
        
        
            
                
                com.wechat.entity.po
            
        
        
            
                ${hibernate.hbm2ddl.auto}
                ${hibernate.dialect}
                ${hibernate.show_sql}
                ${hibernate.format_sql}
                false
            
        
    


四、声明事务

1.基于aop/tx命名空间的配置:spring在Schema的配置中添加了一个tx命名空间,在配置文件中定义事务属性。




    

    
    
    
    
        
        
        
        
    
    
    
        
            
            
            
        
    
    
    

2.使用注解配置声明式事务

1)在xml中配置




2)在业务类上注解

@Service
@Transactional
public class BbtForum {
    public ForumDao forumDao;

    public TopicDao topicDao;

    public PostDao postDao;
    ...}

3)@Transactional的属性

默认属性:

事务传播行为:PROPAGATION_REQUIRED

事务隔离级别:IOSLATION_DEFAULT

读写事务属性:读/写事务

超时时间:-1

回滚设置:热河运行期异常引发回滚、任何检查型异常不会引发回滚


4)spring要在具体的业务类上使用@Transactional注解


5)在方法处使用注解会覆盖类定义的注解,如果方法需要使用特殊的事务属性,可以在方法上使用注解

@Transactional(readOnly = true)
public Forum getForum(int forumId) {
    return forumDao.getForum(forumId);
}


五、事务的一些注意点

1.使用不同的事务管理器

@Transactional("name")使用名为name的事务管理器


2.事务管理的目的是保证数据操作的事务性(原子性、一致性、隔离性、持久性)脱离了事务,DAO一样可以进行数据操作。


3.事务的传播性

PROPAGATION_REQUIERD:如果当前没有事务就创建一个,有就加进去

PROPAGATION_SUPPORTS:支持当前事务,没有就以非事务方式执行

PROPAGATION_MANDATORY:使用当前事务,没有就抛出异常

PROPAGATION_REQURES_NEW:新建事务,如果当前存在事务,就将其挂起

PROPAGATION_NOT_SUPPORTED:以非事务方式执行,如果当前有就挂起

PROPAGATION_NEVER:以非事务方式执行,如果有就挂起

PROPAGATION_NESTED:嵌套事务

相同线程中进行互相嵌套调用的事务方法工作在相同的事务中,如果在不同线程,则不同线程下事务方法工作在独立的事务中。






相关内容

热门资讯

鸿蒙智行承认投诉“竹知了”视频... 针对“竹知了”玩具相关舆情,鸿蒙智行于8月4日晚发布企业声明,介绍了投诉“竹知了”视频相关情况,也表...
抢劫杀人犯死刑改死缓被害人家属... 澎湃新闻记者 熊强云南宣威市乐丰乡1999年“山村小卖部抢劫杀人案”被害人家属申诉迎来新进展:家属徐...
乘客投诉绕路遭出租车司机持铁棍... 8月4日晚,太原市公安局小店分局官方微博通报:7月20日凌晨2时许,我局接到群众报警,小店区体育路许...
中国登山者在巴基斯坦雪崩中遇难... 7月30日,一支10人国际登山队在攀登布洛阿特峰(Broad Peak)时遭遇雪崩失踪。据巴基斯坦高...
阿里字节腾讯同步对内开刀,AI... 文 | 独角兽观察 结束赛马,收拢兵力。最近,阿里字节腾讯三大巨头不约而同地“跳”进同一条河。 7...
“达标蛙”应付抽检,“超标蛙”... 近日,某些地方牛蛙产品被检出抗生素超标或存在禁用兽药成分引发关注。一些涉事企业甚至还搞起“阴阳蛙”分...
“退票可以,但无法退款”?机票... 近日,“1.5万元机票退票仅退400多元”事件引发热议。消费者林先生在携程旅行花费15217元订购了...
Nextorage正式发售UH... IT之家 8 月 4 日消息,Nextorage 日本当地时间今日宣布,其今年 2 月公布的 NX-...
第二十八届中国科协年会成果发布 7月31日上午,中国科协召开第二十八届中国科协年会新闻通气会,介绍了第二十八届中国科协年会成果并回答...
OPPO A7 Pro Max... (图片来源:雷科技摄制) 价格方面: 8+128GB版本:2199元(国补到手价1869.15元) ...