{"id":18688,"date":"2013-11-05T16:00:29","date_gmt":"2013-11-05T14:00:29","guid":{"rendered":"http:\/\/www.javacodegeeks.com\/?p=18688"},"modified":"2013-11-05T08:16:26","modified_gmt":"2013-11-05T06:16:26","slug":"spring-transactions-visibility","status":"publish","type":"post","link":"https:\/\/www.javacodegeeks.com\/2013\/11\/spring-transactions-visibility.html","title":{"rendered":"Spring Transactions Visibility"},"content":{"rendered":"<p>Spring, on initializing application context, creates proxies when it comes across classes marked with @Transactional. @Transactional can be applied at class level or method level. Applying it at class level means all the public methods defined in the class are transactional. The kind of proxy Spring creates i.e. Jdk Proxy or CGLIB proxy, depends on the class in which the method is marked transactional. If the class implements atleast one interface, Spring creates a Jdk dynamic proxy. This proxy implements the same interface as the original class does and intercepts the interface methods with transaction maintenance logic. It delegates the call to the original object composed in it. Suppose the class does not implement any interface, Spring creates a CGLIB proxy. This proxy extends the original class and overrides the public methods. We will take a closer look at this soon. Suppose we have a class defined like this:<\/p>\n<pre class=\" brush:java\">public interface BookDao{\r\n\tvoid buyBook(String isbn) throws BookNotFoundException;\r\n\tBook findByIsbn(String isbn);\r\n\tint deductStock(Book book);\r\n}\r\n\r\npublic class JdbcBookDao implements BookDao{\r\n\tvoid buyBook(String isbn) throws BookNotFoundException{\r\n\t\tBook book = findByIsbn(isbn);\r\n\t\tif(book == null){\r\n\t\tthrow new BookNotFoundException();\r\n\t\t}\r\n\t\tdeductStock(book);\r\n\t}\r\n\r\n\t@Transactional(propagation=Propagation.REQUIRES_NEW)\r\n\tBook findByIsbn(String isbn){\r\n\t\tBook book = getJdbcTemplate().queryForObject(\"SELECT * FROM BOOK WHERE ISBN=?\",\r\n\t\tParameterizedBeanPropertyRowMapper.newInstance(Book.class), isbn);\r\n\t\treturn book;\r\n\t}\r\n\r\n\t@Transactional(propagation=Propagation.REQUIRES_NEW)\r\n\t\tint deductStock(Book book){\r\n\t\tString sql = \"UPDATE BOOK_STOCK SET STOCK=STOCK-1 WHERE BOOK_ID=?\";\r\n\t\treturn getJdbcTemplate().update(sql, stockIncrement, book.getId());\r\n\t}\r\n}<\/pre>\n<p>Now will Spring automatically create a transaction on calling bookDao\u2019s findByIsbn from main method? No. We have to declare this in the xml configuration:<\/p>\n<pre class=\" brush:xml\">&lt;tx:annotation-driven&gt;<\/pre>\n<p>So if it does not create a transaction, will it throw an error? Answer is again a No. Spring executes this statement non-transactionally.<\/p>\n<p>Once we have declared \u2039tx:annotation-driven\u203a, as rightly expected, Spring creates a Jdk dynamic proxy for JdbcBookDao as the class implements an interface. Now say, we call JdbcBookDao\u2019s buyBook method, how many transactions are created by Spring?<\/p>\n<ol>\n<li>Two: 1 for findByIsbn and 1 more for deductStock.<\/li>\n<li>One: Both findByIsbn and deductStock in same tx.<\/li>\n<li>No transaction at all!<\/li>\n<\/ol>\n<p>The answer is (3). The default transaction mode is \u2018proxy\u2019 for transactions. What this means is method calls made through proxy only will be considered for automatic transaction management by Spring. Now if you carefully observe, buyBook method is not marked transactional. And hence when transactional proxy is created, this method does not get intercepted with transaction management logic as it is not marked @Transactional. In short, buyBook is not overridden in proxy. And hence the method directly gets invoked on the original object. And so the other two methods also gets called on the original object. Remember that only PROXY contains transaction management code. So, as the other methods too get called on original object, Spring does not create a transaction at all. Now will the problem be solved if we mark buyBook as @Transactional? Will Spring creates two separate transactions for each findByIsbn and deductStock methods?<div style=\"display:inline-block; margin: 15px 0;\"> <div id=\"adngin-JavaCodeGeeks_incontent_video-0\" style=\"display:inline-block;\"><\/div> <\/div><\/p>\n<p>No. Spring creates only one transaction when buyBook() gets called. It would not create any new transaction further as the respective methods gets called on the original object itself and not the proxy. So how to solve this problem?<\/p>\n<p>Can we ask Spring to create a CGLIB proxy()? Now as the proxy is a subclass with overridden public transactional methods, it creates a new transaction for each of the method call? Again NO. The CGLIB proxy does not directly call the method on super class. Here is a rough idea of how it is implemented.<\/p>\n<pre class=\" brush:java\">import net.sf.cglib.proxy.MethodInterceptor;\r\nimport net.sf.cglib.proxy.MethodProxy;\r\nimport java.lang.reflect.Method;\r\n\r\npublic class MyInterceptor implements MethodInterceptor {\r\n\tprivate Object realObject;\r\n\r\n\tpublic MyInterceptor(Object original) {\r\n\t\tthis.realObject = original;\r\n\t}\r\n\r\n\t\/\/ This method will be called every time the object proxy calls any of its methods\r\n\tpublic Object intercept(Object o, Method method, Object[] args,\r\n                          MethodProxy methodProxy) throws Throwable {\r\n\t\t\/**\r\n\t\t* Transaction Management Code\r\n\t\t*\/\r\n\r\n\t\t\/\/ Invoke the method on the real object with the given params\r\n\t\tObject res = method.invoke(realObject, args);\r\n\r\n\t\t\/**\r\n\t\t* Transaction Management Code\r\n\t\t*\/\r\n\t\treturn res;\r\n\t}\r\n}\r\n\r\nimport net.sf.cglib.proxy.Enhancer;\r\n\r\npublic class ProxyCreator(){\r\n\r\n\tpublic static T createProxy(T original){\r\n\t\t\/\/ Enhancer is CGLIB class which builds a dynamic proxy with new capabilities\r\n\t\tEnhancer e = new Enhancer();\r\n\t\te.setSuperclass(original.getClass());\r\n\r\n\t\t\/\/ We have to declare the interceptor whose 'intercept' will be called when methods are called on proxy.\r\n\t\te.setCallback(new MyInterceptor(original));\r\n\t\tT proxy = (T) e.create();\r\n\t\treturn proxy;\r\n\t}\r\n}<\/pre>\n<p>So as you have seen here, the proxy extends the original class and is composed with it\u2019s object. So when we call buyBook, the proxy creates a transaction and delegates the call to original object. No as findByIsbn and deductStock gets called from buyBook of original object, no new transactions get created.<\/p>\n<p>A quick turnaround solution for this would be as JdbcBookDao is a singleton, get this object from the application context. Now instead of calling methods directly on the object, call it using the reference(to make sure the proxy gets called) Here is how the method may now look like.<\/p>\n<pre class=\" brush:java\">public class JdbcBookDao implements BookDao, ApplicationContextAware{\r\n\tprivate ApplicationContext context;\r\n\tprivate BookDao bookDao;\r\n\r\n\tpublic void setApplicationContext(ApplicationContext context){\r\n\t\tthis.context = context;\r\n\t}\r\n\r\n\tpublic BookDao getBookDao(){\r\n\t\tbookDao = (BookDao)context.getBean(\"jdbcBookDao\");\r\n\t}\r\n\r\n\tvoid buyBook(String isbn) throws BookNotFoundException{\r\n\t\tBook book = getBookDao().findByIsbn(isbn);\r\n\t\tif(book == null){\r\n\t\t\tthrow new BookNotFoundException();\r\n\t\t}\r\n\t\tgetBookDao().deductStock(book);\r\n\t}\r\n\r\n\t.....\r\n}<\/pre>\n<p>Just implemented a crude version to get this up and working. We can definitely improve on the way it is designed. Instead of directly injecting application context into the DAO, may be we can have a kind of helper class which does that. Or another alternative for getting this done is to use programmatic transactions.<\/p>\n<p>A final point to note is that Spring manages transactions only when public methods are marked transactional. For private, protected and package-private methods, Spring does not provide transaction management support. In case of Dynamic proxies, as they implement an interface, all transactional methods are public. So no need to worry about non-public methods. And in case of CGLIB proxies, only public methods get overridden when subclass is created. So even here non-public methods are not considered.<\/p>\n<p>Let me end this discussion with a question. When I tried to proxy target class using \u2039tx:annotation-driven proxy-target-class=\u201dtrue\u201d\/\u203a, it really did not work i.e. <a title=\"CGLIB proxy not getting created for Transactional Proxies\" href=\"http:\/\/stackoverflow.com\/questions\/15829883\/cglib-proxy-not-getting-created-for-transactional-proxies\" target=\"_blank\">CGLIB proxies are not created<\/a>. For this to work, I have to do a minor hack. As spring documentation says clearly if proxy-target-class is enabled on any of \u2039tx:annotation-driven\u203a, \u2039aop:config\u203a or \u2039aop:aspectj-autoproxy\u203a, Spring will enable CGLIB proxy creation on the container. So I just created an empty \u2039aop:config proxy-target-class=\u201dtrue\u201d\/\u203a. And not to worry, it started working! Not sure if it\u2019s a bug in Spring itself. Highly appreciated if some one can answer this.<br \/>\n&nbsp;<\/p>\n<div style=\"border: 1px solid #D8D8D8; background: #FAFAFA; width: 100%; padding-left: 5px;\"><b><i>Reference: <\/i><\/b><a href=\"http:\/\/prasanthnath.wordpress.com\/2013\/04\/09\/spring-transactions-visibility\/\">Spring Transactions Visibility<\/a> from our <a href=\"http:\/\/www.javacodegeeks.com\/jcg\">JCG partner<\/a> Prasanth Gullapalli at the <a href=\"http:\/\/prasanthnath.wordpress.com\/\">prasanthnath<\/a> blog.<\/div>\n","protected":false},"excerpt":{"rendered":"<p>Spring, on initializing application context, creates proxies when it comes across classes marked with @Transactional. @Transactional can be applied at class level or method level. Applying it at class level means all the public methods defined in the class are transactional. The kind of proxy Spring creates i.e. Jdk Proxy or CGLIB proxy, depends on &hellip;<\/p>\n","protected":false},"author":512,"featured_media":240,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[8],"tags":[30],"class_list":["post-18688","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-enterprise-java","tag-spring"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.5 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Spring Transactions Visibility<\/title>\n<meta name=\"description\" content=\"Spring, on initializing application context, creates proxies when it comes across classes marked with @Transactional. @Transactional can be applied at\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.javacodegeeks.com\/2013\/11\/spring-transactions-visibility.html\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Spring Transactions Visibility\" \/>\n<meta property=\"og:description\" content=\"Spring, on initializing application context, creates proxies when it comes across classes marked with @Transactional. @Transactional can be applied at\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.javacodegeeks.com\/2013\/11\/spring-transactions-visibility.html\" \/>\n<meta property=\"og:site_name\" content=\"Java Code Geeks\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/javacodegeeks\" \/>\n<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prasanthnath.g\" \/>\n<meta property=\"article:published_time\" content=\"2013-11-05T14:00:29+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2012\/10\/spring-logo.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"150\" \/>\n\t<meta property=\"og:image:height\" content=\"150\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Prasanth Gullapalli\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@javacodegeeks\" \/>\n<meta name=\"twitter:site\" content=\"@javacodegeeks\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Prasanth Gullapalli\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"6 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2013\\\/11\\\/spring-transactions-visibility.html#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2013\\\/11\\\/spring-transactions-visibility.html\"},\"author\":{\"name\":\"Prasanth Gullapalli\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#\\\/schema\\\/person\\\/1eae1300536490be5d9c39b3e6b5eb0a\"},\"headline\":\"Spring Transactions Visibility\",\"datePublished\":\"2013-11-05T14:00:29+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2013\\\/11\\\/spring-transactions-visibility.html\"},\"wordCount\":855,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2013\\\/11\\\/spring-transactions-visibility.html#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.javacodegeeks.com\\\/wp-content\\\/uploads\\\/2012\\\/10\\\/spring-logo.jpg\",\"keywords\":[\"Spring\"],\"articleSection\":[\"Enterprise Java\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/www.javacodegeeks.com\\\/2013\\\/11\\\/spring-transactions-visibility.html#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2013\\\/11\\\/spring-transactions-visibility.html\",\"url\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2013\\\/11\\\/spring-transactions-visibility.html\",\"name\":\"Spring Transactions Visibility\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2013\\\/11\\\/spring-transactions-visibility.html#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2013\\\/11\\\/spring-transactions-visibility.html#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.javacodegeeks.com\\\/wp-content\\\/uploads\\\/2012\\\/10\\\/spring-logo.jpg\",\"datePublished\":\"2013-11-05T14:00:29+00:00\",\"description\":\"Spring, on initializing application context, creates proxies when it comes across classes marked with @Transactional. @Transactional can be applied at\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2013\\\/11\\\/spring-transactions-visibility.html#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.javacodegeeks.com\\\/2013\\\/11\\\/spring-transactions-visibility.html\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2013\\\/11\\\/spring-transactions-visibility.html#primaryimage\",\"url\":\"https:\\\/\\\/www.javacodegeeks.com\\\/wp-content\\\/uploads\\\/2012\\\/10\\\/spring-logo.jpg\",\"contentUrl\":\"https:\\\/\\\/www.javacodegeeks.com\\\/wp-content\\\/uploads\\\/2012\\\/10\\\/spring-logo.jpg\",\"width\":150,\"height\":150,\"caption\":\"spring-interview-questions-answers\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2013\\\/11\\\/spring-transactions-visibility.html#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.javacodegeeks.com\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Java\",\"item\":\"https:\\\/\\\/www.javacodegeeks.com\\\/category\\\/java\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Enterprise Java\",\"item\":\"https:\\\/\\\/www.javacodegeeks.com\\\/category\\\/java\\\/enterprise-java\"},{\"@type\":\"ListItem\",\"position\":4,\"name\":\"Spring Transactions Visibility\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#website\",\"url\":\"https:\\\/\\\/www.javacodegeeks.com\\\/\",\"name\":\"Java Code Geeks\",\"description\":\"Java Developers Resource Center\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#organization\"},\"alternateName\":\"JCG\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.javacodegeeks.com\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#organization\",\"name\":\"Exelixis Media P.C.\",\"url\":\"https:\\\/\\\/www.javacodegeeks.com\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/www.javacodegeeks.com\\\/wp-content\\\/uploads\\\/2022\\\/06\\\/exelixis-logo.png\",\"contentUrl\":\"https:\\\/\\\/www.javacodegeeks.com\\\/wp-content\\\/uploads\\\/2022\\\/06\\\/exelixis-logo.png\",\"width\":864,\"height\":246,\"caption\":\"Exelixis Media P.C.\"},\"image\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#\\\/schema\\\/logo\\\/image\\\/\"},\"sameAs\":[\"https:\\\/\\\/www.facebook.com\\\/javacodegeeks\",\"https:\\\/\\\/x.com\\\/javacodegeeks\"]},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#\\\/schema\\\/person\\\/1eae1300536490be5d9c39b3e6b5eb0a\",\"name\":\"Prasanth Gullapalli\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/c5d5a8464005751039a7642e5205c773902f251b4537242090e9e8c400cc884a?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/c5d5a8464005751039a7642e5205c773902f251b4537242090e9e8c400cc884a?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/c5d5a8464005751039a7642e5205c773902f251b4537242090e9e8c400cc884a?s=96&d=mm&r=g\",\"caption\":\"Prasanth Gullapalli\"},\"description\":\"Prasanth is passionated about technology and specializes in application development in distributed environments. He has always been fascinated by the new technologies and emerging trends in software development.\",\"sameAs\":[\"http:\\\/\\\/prasanthnath.wordpress.com\\\/\",\"https:\\\/\\\/www.facebook.com\\\/prasanthnath.g\",\"http:\\\/\\\/www.linkedin.com\\\/in\\\/prasanthnath\"],\"url\":\"https:\\\/\\\/www.javacodegeeks.com\\\/author\\\/prasanth-gullapalli\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Spring Transactions Visibility","description":"Spring, on initializing application context, creates proxies when it comes across classes marked with @Transactional. @Transactional can be applied at","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.javacodegeeks.com\/2013\/11\/spring-transactions-visibility.html","og_locale":"en_US","og_type":"article","og_title":"Spring Transactions Visibility","og_description":"Spring, on initializing application context, creates proxies when it comes across classes marked with @Transactional. @Transactional can be applied at","og_url":"https:\/\/www.javacodegeeks.com\/2013\/11\/spring-transactions-visibility.html","og_site_name":"Java Code Geeks","article_publisher":"https:\/\/www.facebook.com\/javacodegeeks","article_author":"https:\/\/www.facebook.com\/prasanthnath.g","article_published_time":"2013-11-05T14:00:29+00:00","og_image":[{"width":150,"height":150,"url":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2012\/10\/spring-logo.jpg","type":"image\/jpeg"}],"author":"Prasanth Gullapalli","twitter_card":"summary_large_image","twitter_creator":"@javacodegeeks","twitter_site":"@javacodegeeks","twitter_misc":{"Written by":"Prasanth Gullapalli","Est. reading time":"6 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.javacodegeeks.com\/2013\/11\/spring-transactions-visibility.html#article","isPartOf":{"@id":"https:\/\/www.javacodegeeks.com\/2013\/11\/spring-transactions-visibility.html"},"author":{"name":"Prasanth Gullapalli","@id":"https:\/\/www.javacodegeeks.com\/#\/schema\/person\/1eae1300536490be5d9c39b3e6b5eb0a"},"headline":"Spring Transactions Visibility","datePublished":"2013-11-05T14:00:29+00:00","mainEntityOfPage":{"@id":"https:\/\/www.javacodegeeks.com\/2013\/11\/spring-transactions-visibility.html"},"wordCount":855,"commentCount":0,"publisher":{"@id":"https:\/\/www.javacodegeeks.com\/#organization"},"image":{"@id":"https:\/\/www.javacodegeeks.com\/2013\/11\/spring-transactions-visibility.html#primaryimage"},"thumbnailUrl":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2012\/10\/spring-logo.jpg","keywords":["Spring"],"articleSection":["Enterprise Java"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.javacodegeeks.com\/2013\/11\/spring-transactions-visibility.html#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.javacodegeeks.com\/2013\/11\/spring-transactions-visibility.html","url":"https:\/\/www.javacodegeeks.com\/2013\/11\/spring-transactions-visibility.html","name":"Spring Transactions Visibility","isPartOf":{"@id":"https:\/\/www.javacodegeeks.com\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.javacodegeeks.com\/2013\/11\/spring-transactions-visibility.html#primaryimage"},"image":{"@id":"https:\/\/www.javacodegeeks.com\/2013\/11\/spring-transactions-visibility.html#primaryimage"},"thumbnailUrl":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2012\/10\/spring-logo.jpg","datePublished":"2013-11-05T14:00:29+00:00","description":"Spring, on initializing application context, creates proxies when it comes across classes marked with @Transactional. @Transactional can be applied at","breadcrumb":{"@id":"https:\/\/www.javacodegeeks.com\/2013\/11\/spring-transactions-visibility.html#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.javacodegeeks.com\/2013\/11\/spring-transactions-visibility.html"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.javacodegeeks.com\/2013\/11\/spring-transactions-visibility.html#primaryimage","url":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2012\/10\/spring-logo.jpg","contentUrl":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2012\/10\/spring-logo.jpg","width":150,"height":150,"caption":"spring-interview-questions-answers"},{"@type":"BreadcrumbList","@id":"https:\/\/www.javacodegeeks.com\/2013\/11\/spring-transactions-visibility.html#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.javacodegeeks.com\/"},{"@type":"ListItem","position":2,"name":"Java","item":"https:\/\/www.javacodegeeks.com\/category\/java"},{"@type":"ListItem","position":3,"name":"Enterprise Java","item":"https:\/\/www.javacodegeeks.com\/category\/java\/enterprise-java"},{"@type":"ListItem","position":4,"name":"Spring Transactions Visibility"}]},{"@type":"WebSite","@id":"https:\/\/www.javacodegeeks.com\/#website","url":"https:\/\/www.javacodegeeks.com\/","name":"Java Code Geeks","description":"Java Developers Resource Center","publisher":{"@id":"https:\/\/www.javacodegeeks.com\/#organization"},"alternateName":"JCG","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.javacodegeeks.com\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/www.javacodegeeks.com\/#organization","name":"Exelixis Media P.C.","url":"https:\/\/www.javacodegeeks.com\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.javacodegeeks.com\/#\/schema\/logo\/image\/","url":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2022\/06\/exelixis-logo.png","contentUrl":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2022\/06\/exelixis-logo.png","width":864,"height":246,"caption":"Exelixis Media P.C."},"image":{"@id":"https:\/\/www.javacodegeeks.com\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/javacodegeeks","https:\/\/x.com\/javacodegeeks"]},{"@type":"Person","@id":"https:\/\/www.javacodegeeks.com\/#\/schema\/person\/1eae1300536490be5d9c39b3e6b5eb0a","name":"Prasanth Gullapalli","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/c5d5a8464005751039a7642e5205c773902f251b4537242090e9e8c400cc884a?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/c5d5a8464005751039a7642e5205c773902f251b4537242090e9e8c400cc884a?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/c5d5a8464005751039a7642e5205c773902f251b4537242090e9e8c400cc884a?s=96&d=mm&r=g","caption":"Prasanth Gullapalli"},"description":"Prasanth is passionated about technology and specializes in application development in distributed environments. He has always been fascinated by the new technologies and emerging trends in software development.","sameAs":["http:\/\/prasanthnath.wordpress.com\/","https:\/\/www.facebook.com\/prasanthnath.g","http:\/\/www.linkedin.com\/in\/prasanthnath"],"url":"https:\/\/www.javacodegeeks.com\/author\/prasanth-gullapalli"}]}},"_links":{"self":[{"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/posts\/18688","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/users\/512"}],"replies":[{"embeddable":true,"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/comments?post=18688"}],"version-history":[{"count":0,"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/posts\/18688\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/media\/240"}],"wp:attachment":[{"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/media?parent=18688"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/categories?post=18688"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/tags?post=18688"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}