From 8d872b717d5bffd2cbb5efc907aee592cdba4461 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=A5=8A=E6=85=B6=E5=A0=82?= Date: Mon, 3 Sep 2018 15:15:04 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B8=AC=E8=A9=A6=20Transactional?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 4 - .../springtest/controller/TestController.java | 46 ++++++++++++ .../ym/springtest/entity/UserInfo.java | 59 +++++++++++++++ .../ym/springtest/repo/UserInfoRepo.java | 6 ++ .../service/TransactionTestService.java | 18 +++++ .../service/TransactionTestServiceImpl.java | 73 +++++++++++++++++++ src/main/resources/application.yml | 48 ++++++++---- 7 files changed, 235 insertions(+), 19 deletions(-) create mode 100644 src/main/java/org/ylhealth/ym/springtest/controller/TestController.java create mode 100644 src/main/java/org/ylhealth/ym/springtest/entity/UserInfo.java create mode 100644 src/main/java/org/ylhealth/ym/springtest/repo/UserInfoRepo.java create mode 100644 src/main/java/org/ylhealth/ym/springtest/service/TransactionTestService.java create mode 100644 src/main/java/org/ylhealth/ym/springtest/service/TransactionTestServiceImpl.java diff --git a/pom.xml b/pom.xml index 71aa69c..5a937d1 100644 --- a/pom.xml +++ b/pom.xml @@ -29,10 +29,6 @@ org.springframework.boot spring-boot-starter-data-jpa - - org.springframework.boot - spring-boot-starter-security - org.springframework.boot spring-boot-starter-web diff --git a/src/main/java/org/ylhealth/ym/springtest/controller/TestController.java b/src/main/java/org/ylhealth/ym/springtest/controller/TestController.java new file mode 100644 index 0000000..cd4eb3d --- /dev/null +++ b/src/main/java/org/ylhealth/ym/springtest/controller/TestController.java @@ -0,0 +1,46 @@ +package org.ylhealth.ym.springtest.controller; + +import javax.inject.Inject; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RestController; +import org.ylhealth.ym.springtest.entity.UserInfo; +import org.ylhealth.ym.springtest.service.TransactionTestService; + +@RestController +public class TestController { + @Inject private TransactionTestService userInfoService; + private Logger logger = LoggerFactory.getLogger(getClass()); + + @GetMapping("/Test1") + public UserInfo test1() { + return userInfoService.findUserInfo("aaa1"); + } + + @GetMapping("/create") + public UserInfo create() { + UserInfo u = new UserInfo("aaa1", "小虫", "闲谈软体架构:休息时间"); + userInfoService.save(u); + return u; + } + + @GetMapping("/testTA") + public String testTransaction() { + userInfoService.testTransaction(); + return "結束"; + } + @GetMapping("/testTA1") + public String testTransaction3() { + userInfoService.testTransaction3(); + return "結束2"; + } + @GetMapping("/testTA2") + public String testTransaction2() { + logger.debug("testTransaction2 start"); + userInfoService.testTransaction1(); + userInfoService.testTransaction2(); + logger.debug("testTransaction2 end"); + return "結束3"; + } +} diff --git a/src/main/java/org/ylhealth/ym/springtest/entity/UserInfo.java b/src/main/java/org/ylhealth/ym/springtest/entity/UserInfo.java new file mode 100644 index 0000000..0010dce --- /dev/null +++ b/src/main/java/org/ylhealth/ym/springtest/entity/UserInfo.java @@ -0,0 +1,59 @@ +package org.ylhealth.ym.springtest.entity; +// Generated 2018/9/3 下午 12:25:54 by Hibernate Tools 4.3.2-SNAPSHOT + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.Id; +import javax.persistence.Table; +import org.hibernate.annotations.Nationalized; + +/** UserInfo generated by hbm2java */ +@Entity +@Table(name = "UserInfo") +public class UserInfo implements java.io.Serializable { + + private String id; + private String name; + private String cname; + + public UserInfo() {} + + public UserInfo(String id) { + this.id = id; + } + + public UserInfo(String id, String name, String cname) { + this.id = id; + this.name = name; + this.cname = cname; + } + + @Id + @Column(name = "id", unique = true, nullable = false, length = 36) + public String getId() { + return this.id; + } + + public void setId(String id) { + this.id = id; + } + + @Column(name = "Name", length = 50) + public String getName() { + return this.name; + } + + public void setName(String name) { + this.name = name; + } + + @Nationalized + @Column(name = "CName") + public String getCname() { + return this.cname; + } + + public void setCname(String cname) { + this.cname = cname; + } +} diff --git a/src/main/java/org/ylhealth/ym/springtest/repo/UserInfoRepo.java b/src/main/java/org/ylhealth/ym/springtest/repo/UserInfoRepo.java new file mode 100644 index 0000000..fdbfd30 --- /dev/null +++ b/src/main/java/org/ylhealth/ym/springtest/repo/UserInfoRepo.java @@ -0,0 +1,6 @@ +package org.ylhealth.ym.springtest.repo; + +import org.springframework.data.jpa.repository.JpaRepository; +import org.ylhealth.ym.springtest.entity.UserInfo; + +public interface UserInfoRepo extends JpaRepository {} diff --git a/src/main/java/org/ylhealth/ym/springtest/service/TransactionTestService.java b/src/main/java/org/ylhealth/ym/springtest/service/TransactionTestService.java new file mode 100644 index 0000000..31cce8d --- /dev/null +++ b/src/main/java/org/ylhealth/ym/springtest/service/TransactionTestService.java @@ -0,0 +1,18 @@ +package org.ylhealth.ym.springtest.service; + +import org.ylhealth.ym.springtest.entity.UserInfo; + +public interface TransactionTestService { + public UserInfo findUserInfo(String id); + + public void save(UserInfo u); + + public void testTransaction(); + + public void testTransaction1(); + + public void testTransaction2(); + + + public void testTransaction3(); +} diff --git a/src/main/java/org/ylhealth/ym/springtest/service/TransactionTestServiceImpl.java b/src/main/java/org/ylhealth/ym/springtest/service/TransactionTestServiceImpl.java new file mode 100644 index 0000000..d420505 --- /dev/null +++ b/src/main/java/org/ylhealth/ym/springtest/service/TransactionTestServiceImpl.java @@ -0,0 +1,73 @@ +package org.ylhealth.ym.springtest.service; + +import javax.inject.Inject; +import javax.transaction.Transactional; +import javax.transaction.Transactional.TxType; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Service; +import org.ylhealth.ym.springtest.entity.UserInfo; +import org.ylhealth.ym.springtest.repo.UserInfoRepo; + +/** + * 測試 @Transactional 的使用 + * 在 servcie 中互 call,被 call 的 method , annotation 是無效的。 + * 觀察 o.s.orm.jpa.JpaTransactionManager 的 log 是不是在 method 中的 log 之前還是之後來辨断 + */ +@Service +public class TransactionTestServiceImpl implements TransactionTestService { + private Logger logger = LoggerFactory.getLogger(getClass()); + + @Inject private UserInfoRepo userInfoRepo; + + @Override + public UserInfo findUserInfo(String id) { + return userInfoRepo.findOne(id); + } + + @Override + public void save(UserInfo u) { + userInfoRepo.save(u); + } + + + @Override + @Transactional(value=TxType.REQUIRES_NEW) + public void testTransaction1() { + logger.debug("testTransaction1 start"); + userInfoRepo.findOne("aaa"); + logger.debug("testTransaction1 end"); + } + + @Override + @Transactional(value=TxType.REQUIRES_NEW) + public void testTransaction2() { + logger.debug("testTransaction2 start"); + userInfoRepo.findOne("aaa1"); + logger.debug("testTransaction2 end"); + } + + /** + * service 中互 call, 被 call 的 method annotation 是無效的 + * transaction 會在實際使用到時才產生 + */ + @Override + public void testTransaction() { + logger.debug("testTransaction start"); + testTransaction1(); + testTransaction2(); + logger.debug("testTransaction end"); + } + + /** + * 只會產生一個 Transaction + */ + @Override + @Transactional(value=TxType.REQUIRED) + public void testTransaction3() { + logger.debug("testTransaction3 start"); + testTransaction1(); + testTransaction2(); + logger.debug("testTransaction3 end"); + } +} diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index 73df71b..36c4de5 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -1,16 +1,34 @@ spring: - devtools: - restart: - enabled: true - livereload: - enabled: true - datasource: - url: jdbc:sqlserver://192.168.2.11:1433;databaseName=CRM_DEMO;sendStringParametersAsUnicode=false; - driver-class-name: com.microsoft.sqlserver.jdbc.SQLServerDriver - username: archuser - password: archuser - max-wait: 10000 - max-active: 10 - test-on-borrow: true - validation-query: SELECT 1 - jmx-enabled: true \ No newline at end of file + devtools: + restart: + enabled: true + livereload: + enabled: true + datasource: + url: jdbc:sqlserver://10.32.86.125:443;databaseName=TestDB;sendStringParametersAsUnicode=false; + driver-class-name: com.microsoft.sqlserver.jdbc.SQLServerDriver + username: archuser + password: archuser + jmx-enabled: true + jpa: + hibernate: + naming: + physical-strategy: org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl + implicit-strategy: org.hibernate.boot.model.naming.ImplicitNamingStrategyLegacyJpaImpl + properties: + hibernate: + show_sql: true + format_sql: false + dialect: org.hibernate.dialect.SQLServer2012Dialect + globally_quoted_identifiers: true + temp: + use_jdbc_metadata_defaults: false + +logging: + level: + org: + ylhealth.ym.springtest: DEBUG + springframework: + orm.jpa.JpaTransactionManager: DEBUG # 設為 DEBUG 可查看 transaction + transaction: DEBUG # 設為 DEBUG 可查看 transaction + web.filter.CommonsRequestLoggingFilter: DEBUG \ No newline at end of file -- 2.26.2