Spring中事务的使用与配置

代码 代码 1338 人阅读 | 0 人回复

<
文章目次



Spring中事件的利用取设置

1.事件观点


  • 甚么是事件?
    ①事件是数据库操作最底子单位,逻辑上一组操作,要末皆成功,假如有一个失利一切操作皆失利
    ②典范场景:银止转账 ,张三转账 100 元给李四, 张三少 100,李四多 100
  • 事件的四个特征(ACID)
    ①本子性
    ②分歧性
    ③断绝性
    ④耐久性
2.事件操作(模仿事件操作情况)

205403cuwxgwswuxdwgu4q.jpg

①创立 service,拆建 dao,完成工具创立战注进干系
  1. //(1)service 注进 dao,正在 dao 注进 JdbcTemplate,正在 JdbcTemplate 注进 DataSource
  2. @Service
  3. public class UserService {
  4.     //注进 dao
  5.     @Autowired
  6.     private UserDao userDao;
  7. }
  8. @Repository
  9. public class UserDaoImpl implements UserDao {
  10.     @Autowired
  11.     private JdbcTemplate jdbcTemplate;
  12. }
复造代码
②正在 dao 创立两个办法:多钱战少钱的办法,正在 service 创立办法(转账的办法)
  1. @Repository
  2. public class UserDaoImpl implements UserDao {
  3.     @Autowired
  4.     private JdbcTemplate jdbcTemplate;
  5.     //lucy 转账 100 给 mary
  6.     //少钱
  7.     @Override
  8.     public void reduceMoney() {
  9.         String sql = "update t_account set money=money-? where username=?";
  10.         jdbcTemplate.update(sql,100,"lucy");
  11.     }
  12.     //多钱
  13.     @Override
  14.     public void addMoney() {
  15.         String sql = "update t_account set money=money+? where username=?";
  16.         jdbcTemplate.update(sql,100,"mary");
  17.     }
  18. }
  19. @Service
  20. public class UserService {
  21.     //注进 dao
  22.     @Autowired
  23.     private UserDao userDao;
  24.     //转账的办法
  25.     public void accountMoney() {
  26.         //lucy 少 100
  27.         userDao.reduceMoney();
  28.         //mary 多 100
  29.         userDao.addMoney();
  30.     }
  31. }
  32. /**
  33.         上边代码一般施行出有成绩,
  34.         可是假如代码施行过程当中呈现非常,有成绩,以下模仿非常!
  35. */
  36. @Service
  37. public class UserService {
  38.     //那里施行后将会发生毛病(非常),lucy 少 100后,mary没有会多 100,那便不合错误了!!
  39.     private UserDao userDao;
  40.     //转账办法
  41.     public void accountMoney(){
  42.         userDao.reduceMoney();//lucy 少 100
  43.         int x=10/0;
  44.         userDao.addMoney(); //mary 多 100
  45.     }
  46. }
  47. //处理上边的非常办法——【编程式事件(传统办法)】
  48. //转账的办法
  49. public void accountMoney() {
  50.     try {
  51.         //第一步 开启事件
  52.         //第两步 停止营业操纵
  53.         //lucy少100
  54.         userDao.reduceMoney();
  55.         //模仿非常
  56.         int i = 10/0;
  57.         //mary多100
  58.         userDao.addMoney();
  59.         //第三步 出有发作非常,提交事件
  60.     }catch(Exception e) {
  61.         //第四步 呈现非常,事件回滚
  62.     }
  63. }
复造代码
3.事件办理(Spring事件办理)


  • 事件增加到 JavaEE 三层规划内里 Service 层(营业逻辑层)
  • 正在 Spring 停止事件办理操作 ;两种方法:
    ①编程式事件办理、
    ②声明式事件办理(保举利用)
  • 声明式事件办理 :
    ①基于注解方法(保举利用)
    ②基于 xml 设置文件方法
  • 正在 Spring 停止声明式事件办理,底层利用 AOP 道理
  • Spring 事件办理 API :供给一个接心,代表事件办理器,那个接心针对差别的框架供给差别的完成类
4.事件操作(注解声明式事件办理)


  • 正在 spring 设置文件,设置事件办理器
    1. <!--创立事件办理器-->
    2. <bean id="transactionManager"
    3.       class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    4.     <!--注进数据源-->
    5.     <property name="dataSource" ref="dataSource"></property>
    6. </bean>
    复造代码
  • 正在 spring 设置文件,开启事件注解
    1. <!--开启事件注解-->
    2. <tx:annotation-driven transactionmanager="transactionManager"></tx:annotation-driven>
    复造代码
  • 正在 service 类上里(大概 service 类内里办法上里)增加事件注解
    ① @Transactional,那个注解增加到类上里,也能够增加办法上里
    ②假如把那个注解增加类上里,那个类内里一切的办法皆增加事件
    ③假如把那个注解增加办法上里,为那个办法增加事件
    1. @Service
    2. @Transactional
    3. public class UserService {
    4.     @Autowired
    5.     private UserDao userDao;
    6.     public void accountMony() {
    7.         userDao.reduceMoney();
    8.         int i = 10 / 0;
    9.         userDao.addMoney();
    10.     }
    11. }
    复造代码
5.事件操作(声明式事件办理参数设置)


  • propagation(事件传布举动):多事件办法间接停止挪用,那个过程当中事件是怎样停止办理的。
    205404iaavffv0fffdf2hh.jpg

    spring框架事件传布举动有七种:上面只引见经常使用的两种传布举动
    REQUIRED:假如add办法本人有事件,挪用update办法后,update利用当前add办法内里的事件。 假如add办法本人出有事件,挪用update办法后,创立新的事件。
    REQUIRED_NEW:利用add挪用update办法,不管add办法能否有事件,城市创立新的事件。
    1. @Transactional(propagation = Propagation.REQUIRED,)                        //事件一
    2. public void add(){
    3.     //挪用update办法
    4.     update();
    5. }
    6. public void update(){         //事件两
    7. }
    复造代码
    Spring界说的7品种传布举动:
205404kgujuly2n2s5dnlo.jpg


  • ioslation(事件断绝级别)
    事件有特征成为断绝性,多事件操作之间没有会发生影响。没有思索断绝性发生许多成绩 。有三个读成绩:净读、不成反复读、实(幻)读 。
    净读:一个已提交事件读与到另外一个已提交事件的数据。
    不成反复读:一个已提交事件读与到另外一提交事件修正数据。
    实读:一个已提交事件读与到另外一提交事件增加数据。
    处理法子:经由过程设置事件断绝级别,处理读成绩
       净读不成反复读幻读READ UNCOMMITTED(读已提交)有有有READ COMMITTED(读已提交)无有有REPEATABLE READ(可反复读)无无有SERIALIZABLE(串止化)无无无
    1. @Transactional(propagation = Propagation.REQUIRED,isolation = Isolation.REPEATABLE_READ)
    复造代码
  • timeout(超不时间)
    ①事件需求正在必然工夫内乱停止提交,假如没有提交停止回滚 。
    ②默许值是 -1(没有超时) ,设置工夫以秒单位停止策画。
  • readOnly(能否只读)
    ①读:查询操作,写:增加修正删除操作。
    ②readOnly 默许值 false,暗示能够查询,能够增加修正删除操作。
    ③设置 readOnly 值是 true,设置成 true 以后,只能查询。
  • rollbackFor(回滚)
    设置呈现哪些非常停止事件回滚
  • noRollbackFor(没有回滚)
    设置呈现哪些非常没有停止事件回滚
6.事件操作(XML 声明式事件办理)


  • 正在 spring 设置文件中停止设置 :
    ①设置事件办理器
    ②设置告诉
    ③设置切进面战切里
    1. <!--创立事件办理器-->
    2. <bean id="transactionManager"
    3.       class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    4.     <!--注进数据源-->
    5.     <property name="dataSource" ref="dataSource"></property>
    6. </bean><span class="token tag">        <span class="token tag">                <span class="token tag">            <!--开启事件注解-->
    7. <tx:annotation-driven transactionmanager="transactionManager"></tx:annotation-driven><span class="token tag">        <span class="token tag">        <!--开启事件注解-->
    8. <tx:annotation-driven transactionmanager="transactionManager"></tx:annotation-driven>
    复造代码
7.事件操作(完整注解声明式事件办理)

创立设置类,利用设置类替换 xml 设置文件
  1. //1、创立设置类,利用设置类替换 xml 设置文件
  2. @Configuration //设置类
  3. @ComponentScan(basePackages = "com.atguigu") //组件扫描
  4. @EnableTransactionManagement //开启事件
  5. public class TxConfig {
  6.     //创立数据库毗连池
  7.     @Bean
  8.     public DruidDataSource getDruidDataSource() {
  9.         DruidDataSource dataSource = new DruidDataSource();
  10.         dataSource.setDriverClassName("com.mysql.jdbc.Driver");
  11.         dataSource.setUrl("jdbc:mysql:///test");
  12.         dataSource.setUsername("root");
  13.         dataSource.setPassword("root");
  14.         return dataSource;
  15.     }
  16.     //创立 JdbcTemplate 工具
  17.     @Bean
  18.     public JdbcTemplate getJdbcTemplate(DataSource dataSource) {//从IOC容器中拿到设置注进的数据源
  19.         //到 ioc 容器中按照范例找到 dataSource
  20.         JdbcTemplate jdbcTemplate = new JdbcTemplate();
  21.         //注进 dataSource
  22.         jdbcTemplate.setDataSource(dataSource);
  23.         return jdbcTemplate;
  24.     }
  25.     //创立事件办理器
  26.     @Bean
  27.     public DataSourceTransactionManager
  28.         getDataSourceTransactionManager(DataSource dataSource) {
  29.         DataSourceTransactionManager transactionManager = new DataSourceTransactionManager();
  30.         transactionManager.setDataSource(dataSource);
  31.         return transactionManager;
  32.     }
  33. }
复造代码
  1. @Test
  2. public void test1() {
  3.     ApplicationContext context = new AnnotationConfigApplicationContext(TxConfig.class);
  4.     UserService userService = context.getBean("userService", UserService.class);
  5.     userService.accountMony();
  6. }
复造代码

最初喜好的小同伴别记了一键三连哦
免责声明:假如进犯了您的权益,请联络站少,我们会实时删除侵权内乱容,感谢协作!
1、本网站属于个人的非赢利性网站,转载的文章遵循原作者的版权声明,如果原文没有版权声明,按照目前互联网开放的原则,我们将在不通知作者的情况下,转载文章;如果原文明确注明“禁止转载”,我们一定不会转载。如果我们转载的文章不符合作者的版权声明或者作者不想让我们转载您的文章的话,请您发送邮箱:Cdnjson@163.com提供相关证明,我们将积极配合您!
2、本网站转载文章仅为传播更多信息之目的,凡在本网站出现的信息,均仅供参考。本网站将尽力确保所提供信息的准确性及可靠性,但不保证信息的正确性和完整性,且不对因信息的不正确或遗漏导致的任何损失或损害承担责任。
3、任何透过本网站网页而链接及得到的资讯、产品及服务,本网站概不负责,亦不负任何法律责任。
4、本网站所刊发、转载的文章,其版权均归原作者所有,如其他媒体、网站或个人从本网下载使用,请在转载有关文章时务必尊重该文章的著作权,保留本网注明的“稿件来源”,并自负版权等法律责任。
回复 关闭延时

使用道具 举报

 
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则