一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - 使用spring框架實現數據庫事務處理方式

使用spring框架實現數據庫事務處理方式

2022-01-25 01:08程序猿新手_曹先生 Java教程

這篇文章主要介紹了使用spring框架實現數據庫事務處理方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

使用spring框架實現數據庫事務處理

事務對于數據庫來說是,是對sql語句的一系列操作,這些操作被組織成為一個事務。事務具有原子性的,要么全部執行,要么不執行。若事務中sql語句發生錯誤,事務需要對已經執行的sql進行回滾操作,撤銷先前對數據庫的操作,防止數據庫出現錯誤狀態。

JDBC對數據庫事務處理的支持

jdbc本身提供了對數據庫處理的支持,使用java.sql.Connection對象完成事務的提交。使用Connection提交數據庫事務處理如下:

使用spring框架實現數據庫事務處理方式

發現里面有一個方法叫setAutoCommit(),設置為true時,就是自動提交sql,如果設置為false時,sql語句的提交由程序負責,應用程序必須調用Commit方法,同時在執行sql語句異常處理塊中調用rollback方法,對異常發生前進行的數據庫進行回滾。

在企業級中,事務一般都是并發執行的,當事務并發執行時,就會發生數據庫同步的問題,具體問題可分為下面四種類型:

  • 臟讀:
  • 不可重復讀:
  • 丟失更新:
  • 幻讀:

為了解決上面的四種問題,解決事務并發的問題

JDBC定義了五種事務隔離級別來解決這些并發導致的問題

  • transaction_read_uncommitted:數據級別最低,俗稱臟讀,在沒有提交數據時,就已經讀取到已經更新的數據。
  • transaction_read_committed:當一個事務進行查詢時,允許讀取提交前的數據,數據提交后,當前查詢就可以讀取到數據,update數據的時候并不鎖住表。(最長使用)
  • transaction_repeatable_read:當一個事務進行查詢時,不允許讀取其他事務更新的數據,可以讀取其他事務新增的數據。
  • transaction_serializable:當一個事務進行查詢時,不允許任何對這個事務進行查詢,就是把并行改成了串行。不提倡使用。

在spring框架中調用一個數據庫事務處理分三步走:

  • 第一步就是配置數據源就是配置數據庫的名稱和密碼,地址等。
  • 第二步就是聲明事務管理TransactionManagerspring框架提供了PlatformTransactionManager作為事務管理類的頂層接口,聲明了初始化事務,提交事務,回滾事務等接口。接口實現由具體的數據庫驅動類實現。具體包括DataTransactionManager等實現類。但是主要還是使用的是DataTransactionManager類。
  • 使用spring框架實現數據庫事務處理方式
  • 定義可以執行事務的DAO類DAO提供了應用程序訪問數據源必要的接口和方法。

 

spring 事務實現方式有哪些

編程式事務管理,

在代碼中調用 commit()、rollback()等事務管理相關的方法

maven pom.xml文件

<dependency>
	<groupId>org.springframework</groupId>
	<artifactId>spring-beans</artifactId>
	<version>4.2.4.RELEASE</version>
</dependency>

<dependency>
	<groupId>org.springframework</groupId>
	<artifactId>spring-context</artifactId>
	<version>4.2.4.RELEASE</version>
</dependency>

<dependency>
	<groupId>org.springframework</groupId>
	<artifactId>spring-aop</artifactId>
	<version>4.2.4.RELEASE</version>
</dependency>

<dependency>
	<groupId>org.springframework</groupId>
	<artifactId>spring-tx</artifactId>
	<version>4.2.4.RELEASE</version>
</dependency>

<dependency>
	<groupId>org.springframework</groupId>
	<artifactId>spring-jdbc</artifactId>
	<version>4.2.4.RELEASE</version>
</dependency>

<!-- mysql驅動 -->
<dependency>
	<groupId>mysql</groupId>
	<artifactId>mysql-connector-java</artifactId>
	<version>5.1.18</version>
</dependency>

編程式事務管理,可以通過 java.sql.Connection 控制事務。spring 配置文件

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:context="http://www.springframework.org/schema/context"
	xsi:schemaLocation="
		http://www.springframework.org/schema/beans 
		http://www.springframework.org/schema/beans/spring-beans.xsd
	    http://www.springframework.org/schema/context
      http://www.springframework.org/schema/context/spring-context.xsd">
      
	<bean id="driver" class="com.mysql.jdbc.Driver"></bean>

	<bean id="datasource" class="org.springframework.jdbc.datasource.SimpleDriverDataSource">
		<constructor-arg index="0" name="driver" ref="driver" />
		<constructor-arg index="1">
			<value>jdbc:mysql://localhost:3306/test</value>
		</constructor-arg>
		<constructor-arg index="2">
			<value>root</value>
		</constructor-arg>
		<constructor-arg index="3">
			<value>root</value>
		</constructor-arg>
	</bean>	
</beans>

測試代碼

package constxiong.interview.transaction; 
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement; 
import javax.sql.DataSource; 
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext; 
public class TransactionTest {

	public static void main(String[] args) throws Exception {
		testManualTransaction();//測試函數式控制事務
	}
	
	private static void testManualTransaction() throws SQLException {
		ApplicationContext context = new ClassPathXmlApplicationContext("spring_transaction.xml");
		DataSource ds = (DataSource)context.getBean("datasource");
		Connection conn = ds.getConnection();
		try {
			initTable(conn);//初始化表
			conn.setAutoCommit(false);//設置不自動提交事務
			queryUsers(conn);//查詢打印用戶表
			deleteUser(conn);//刪除 id=1 用戶
			conn.rollback();//回滾
			queryUsers(conn);//查詢打印用戶表
		} finally {
			conn.close();
		}
	}

	private static void initTable(Connection conn) throws SQLException {
		conn.createStatement().execute("drop table if exists user");
		conn.createStatement().execute("create table user(id int, username varchar(60)) ENGINE=InnoDB DEFAULT CHARSET=utf8 ");//是否支持事務與數據庫引擎有關,此處刪除 ENGINE=InnoDB DEFAULT CHARSET=utf8 可能不支持事務
		conn.createStatement().execute("insert into user values(1, 'user1')");
		conn.createStatement().execute("insert into user values(2, 'user2')");
	}

	private static void deleteUser(Connection conn) throws SQLException {
		conn.createStatement().execute("delete from user where id = 1");
	}

	private static void queryUsers(Connection conn) throws SQLException {
		Statement st = conn.createStatement();
		st.execute("select * from user");
		ResultSet rs = st.getResultSet();
		while (rs.next()) {
			System.out.print(rs.getString("id"));
			System.out.print(" ");
			System.out.print(rs.getString("username"));
			System.out.println();
		}
	}	
}

刪除用戶語句回滾,打印出兩個用戶

1 user1

2 user2

1 user1

2 user2

TransactionProxyFactoryBean 的聲明式事務管理

新增 UserDao 接口

package constxiong.interview.transaction; 
import java.util.List;
import java.util.Map; 
public interface UserDao { 
	/**
	 * 查詢用戶
	 * @return
	 */
	public List<Map<String, Object>> getUsers();
	
	/**
	 * 刪除用戶
	 * @param id
	 * @return
	 */
	public int deleteUser(int id);	
}

新增 UserDao 實現

package constxiong.interview.transaction; 
import java.util.List;
import java.util.Map; 
import org.springframework.jdbc.core.support.JdbcDaoSupport; 
public class UserDaoImpl extends JdbcDaoSupport implements UserDao {
	
	/**
	 * 查詢用戶
	 * @return
	 */
	public List<Map<String, Object>> getUsers() {
		String sql = "select * from user";
		return this.getJdbcTemplate().queryForList(sql);
	}
	
	/**
	 * 刪除用戶
	 * @param id
	 * @return
	 */
	public int deleteUser(int id){
		String sql = "delete from user where id = " + id;
		int result = this.getJdbcTemplate().update(sql);
		if (id == 1) {
			throw new RuntimeException();
		}
		return result;
	}
}

修改 spring 配置文件,添加事務管理器 DataSourceTransactionManager 和事務代理類 TransactionProxyFactoryBean

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:context="http://www.springframework.org/schema/context"
	xsi:schemaLocation="
		http://www.springframework.org/schema/beans 
		http://www.springframework.org/schema/beans/spring-beans.xsd
	    http://www.springframework.org/schema/context
      http://www.springframework.org/schema/context/spring-context.xsd">
      
	<bean id="driver" class="com.mysql.jdbc.Driver"></bean>
	
	<bean id="datasource" class="org.springframework.jdbc.datasource.SimpleDriverDataSource">
		<constructor-arg index="0" name="driver" ref="driver" />
		<constructor-arg index="1">
			<value>jdbc:mysql://localhost:3306/test</value>
		</constructor-arg>
		<constructor-arg index="2">
			<value>root</value>
		</constructor-arg>
		<constructor-arg index="3">
			<value>root</value>
		</constructor-arg>
	</bean>
	
	<bean id="userDao" class="constxiong.interview.transaction.UserDaoImpl">
		<property name="dataSource" ref="datasource"></property>
	</bean>
	
	<!-- 事務管理器 -->
	<bean id="tracnsactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
		<property name="dataSource" ref="datasource"></property>
	</bean>
	
	<bean id="userProxy" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
		<property name="transactionManager" ref="tracnsactionManager"></property>
		<property name="target" ref="userDao"></property>
		<property name="transactionAttributes">
			<props>
				<!-- 主要 key 是方法   
					ISOLATION_DEFAULT  事務的隔離級別
					PROPAGATION_REQUIRED  傳播行為
				-->
				<!-- -Exception 表示發生指定異常回滾,+Exception 表示發生指定異常提交 -->
				<prop key="deleteUser">-java.lang.RuntimeException</prop>
			</props>
		</property>
	</bean>
	
</beans>

測試代碼

package constxiong.interview.transaction; 
import java.util.Map; 
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext; 
public class TransactionTest { 
	static ApplicationContext context = new ClassPathXmlApplicationContext("spring_transaction.xml");	
	public static void main(String[] args) throws Exception {
		testUseTransactionProxy(); //測試使用 spring TransactionProxyFactoryBean
	}
	
	private static void testUseTransactionProxy() {
		final UserDao userDao = (UserDao)context.getBean("userProxy");
		printUsers(userDao);//打印用戶
		userDao.deleteUser(1);//刪除 id=1 用戶
	}

	private static void printUsers(UserDao userDao) {
		for (Map<String, Object> user : userDao.getUsers()) {
			System.out.println(user);
		}
	} 
}

結果輸出

{id=1, username=user1}
{id=2, username=user2}
Exception in thread "main" java.lang.RuntimeException
at constxiong.interview.transaction.UserDaoImpl.deleteUser(UserDaoImpl.java:28)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:302)
at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:190)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157)
at org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:99)
at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:281)
at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:96)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:208)
at com.sun.proxy.$Proxy3.deleteUser(Unknown Source)
at constxiong.interview.transaction.TransactionTest.testUseTransactionProxy(TransactionTest.java:32)
at constxiong.interview.transaction.TransactionTest.main(TransactionTest.java:13)

使用spring框架實現數據庫事務處理方式

注解 @Transactional 的聲明式事務管理

UserDaoImpl 刪除用戶方法添加注解 @Transactional(rollbackFor=RuntimeException.class) 出現 RuntimeException 回滾

package constxiong.interview.transaction; 
import java.util.List;
import java.util.Map; 
import org.springframework.jdbc.core.support.JdbcDaoSupport;
import org.springframework.transaction.annotation.Transactional; 
public class UserDaoImpl extends JdbcDaoSupport implements UserDao {	
	/**
	 * 查詢用戶
	 * @return
	 */
	public List<Map<String, Object>> getUsers() {
		String sql = "select * from user";
		return this.getJdbcTemplate().queryForList(sql);
	}
	
	/**
	 * 刪除用戶
	 * @param id
	 * @return
	 */
	@Transactional(rollbackFor=RuntimeException.class)
	public int deleteUser(int id){
		String sql = "delete from user where id = " + id;
		int result = this.getJdbcTemplate().update(sql);
		if (id == 1) {
			throw new RuntimeException();
		}
		return result;
	}
}

修改 spring 配置文件,開啟 spring 的事務注解能力

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:context="http://www.springframework.org/schema/context"
	xmlns:tx="http://www.springframework.org/schema/tx"
	xsi:schemaLocation="
		http://www.springframework.org/schema/beans 
		http://www.springframework.org/schema/beans/spring-beans.xsd
		http://www.springframework.org/schema/tx
      http://www.springframework.org/schema/tx/spring-tx-3.2.xsd
	    http://www.springframework.org/schema/context
      http://www.springframework.org/schema/context/spring-context.xsd">
      
	<bean id="driver" class="com.mysql.jdbc.Driver"></bean>
	
	<bean id="datasource" class="org.springframework.jdbc.datasource.SimpleDriverDataSource">
		<constructor-arg index="0" name="driver" ref="driver" />
		<constructor-arg index="1">
			<value>jdbc:mysql://localhost:3306/test</value>
		</constructor-arg>
		<constructor-arg index="2">
			<value>root</value>
		</constructor-arg>
		<constructor-arg index="3">
			<value>root</value>
		</constructor-arg>
	</bean>
	
	<bean id="userDao" class="constxiong.interview.transaction.UserDaoImpl">
		<property name="dataSource" ref="datasource"></property>
	</bean>
	
	<!-- 事務管理器 -->
	<bean id="tracnsactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
		<property name="dataSource" ref="datasource"></property>
	</bean>
	
	<!-- 啟用事務注解 -->
	<tx:annotation-driven transaction-manager="tracnsactionManager"/>	
</beans>

測試代碼

package constxiong.interview.transaction; 
import java.util.Map; 
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext; 
public class TransactionTest { 
	static ApplicationContext context = new ClassPathXmlApplicationContext("spring_transaction.xml");	
	public static void main(String[] args) throws Exception {
		testAnnotationTransaction();
	}	
	
	private static void testAnnotationTransaction() {
		UserDao userDao = (UserDao)context.getBean("userDao");
		printUsers(userDao);
		userDao.deleteUser(1);
	} 

	private static void printUsers(UserDao userDao) {
		for (Map<String, Object> user : userDao.getUsers()) {
			System.out.println(user);
		}
	} 
}

輸出結果

{id=1, username=user1}
{id=2, username=user2}
Exception in thread "main" java.lang.RuntimeException
at constxiong.interview.transaction.UserDaoImpl.deleteUser(UserDaoImpl.java:30)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:302)
at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:190)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157)
at org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:99)
at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:281)
at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:96)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:208)
at com.sun.proxy.$Proxy5.deleteUser(Unknown Source)
at constxiong.interview.transaction.TransactionTest.testAnnotationTransaction(TransactionTest.java:20)
at constxiong.interview.transaction.TransactionTest.main(TransactionTest.java:13)

使用spring框架實現數據庫事務處理方式

Aspectj AOP 配置(注解)事務

maven pom.xml 添加 Aspectj 的支持

<dependency>
  <groupId>org.aspectj</groupId>
  <artifactId>aspectjweaver</artifactId>
  <version>1.8.13</version>
</dependency>

去除 UserDaoImpl 注解@Transactional(rollbackFor=RuntimeException.class)

package constxiong.interview.transaction; 
import java.util.List;
import java.util.Map; 
import org.springframework.jdbc.core.support.JdbcDaoSupport; 
public class UserDaoImpl extends JdbcDaoSupport implements UserDao {	
	/**
	 * 查詢用戶
	 * @return
	 */
	public List<Map<String, Object>> getUsers() {
		String sql = "select * from user";
		return this.getJdbcTemplate().queryForList(sql);
	}
	
	/**
	 * 刪除用戶
	 * @param id
	 * @return
	 */
	public int deleteUser(int id){
		String sql = "delete from user where id = " + id;
		int result = this.getJdbcTemplate().update(sql);
		if (id == 1) {
			throw new RuntimeException();
		}
		return result;
	}
}

修改 spring 配置文件,織入切面

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:context="http://www.springframework.org/schema/context"
	xmlns:tx="http://www.springframework.org/schema/tx"
	xmlns:aop="http://www.springframework.org/schema/aop"
	xsi:schemaLocation="
		http://www.springframework.org/schema/beans 
		http://www.springframework.org/schema/beans/spring-beans.xsd
		http://www.springframework.org/schema/tx
      http://www.springframework.org/schema/tx/spring-tx-3.2.xsd
      http://www.springframework.org/schema/aop
      http://www.springframework.org/schema/aop/spring-aop.xsd
	    http://www.springframework.org/schema/context
      http://www.springframework.org/schema/context/spring-context.xsd">
      
	<bean id="driver" class="com.mysql.jdbc.Driver"></bean>
	
	<bean id="datasource" class="org.springframework.jdbc.datasource.SimpleDriverDataSource">
		<constructor-arg index="0" name="driver" ref="driver" />
		<constructor-arg index="1">
			<value>jdbc:mysql://localhost:3306/test</value>
		</constructor-arg>
		<constructor-arg index="2">
			<value>root</value>
		</constructor-arg>
		<constructor-arg index="3">
			<value>root</value>
		</constructor-arg>
	</bean>
	
	<bean id="userDao" class="constxiong.interview.transaction.UserDaoImpl">
		<property name="dataSource" ref="datasource"></property>
	</bean>
	
	<!-- 事務管理器 -->
	<bean id="tracnsactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
		<property name="dataSource" ref="datasource"></property>
	</bean>
	
	<tx:advice id="txAdvice" transaction-manager="tracnsactionManager">
		<tx:attributes>
			<!-- 為連接點指定事務屬性 -->
			<tx:method name="deleteUser" rollback-for="java.lang.RuntimeException"/>
		</tx:attributes>
	</tx:advice>
	
	<aop:config>
		<!-- 切入點配置 -->
		<aop:pointcut id="point" expression="execution(* *constxiong.interview.transaction.UserDao.deleteUser(..))" />
		<aop:advisor advice-ref="txAdvice" pointcut-ref="point"/>
	</aop:config>	
</beans>

測試代碼

package constxiong.interview.transaction; 
import java.util.Map; 
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext; 
public class TransactionTest { 
	static ApplicationContext context = new ClassPathXmlApplicationContext("spring_transaction.xml");	
	public static void main(String[] args) throws Exception {
		testAspectjTransaction();
	}	
	
	private static void testAspectjTransaction() {
		UserDao userDao = (UserDao)context.getBean("userDao");
		printUsers(userDao);
		userDao.deleteUser(1);
	} 

	private static void printUsers(UserDao userDao) {
		for (Map<String, Object> user : userDao.getUsers()) {
			System.out.println(user);
		}
	} 
}

輸出結果

{id=1, username=user1}
{id=2, username=user2}
Exception in thread "main" java.lang.RuntimeException
at constxiong.interview.transaction.UserDaoImpl.deleteUser(UserDaoImpl.java:28)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:302)
at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:190)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157)
at org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:99)
at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:281)
at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:96)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:92)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:208)
at com.sun.proxy.$Proxy2.deleteUser(Unknown Source)
at constxiong.interview.transaction.TransactionTest.testAnnotationTransaction(TransactionTest.java:20)
at constxiong.interview.transaction.TransactionTest.main(TransactionTest.java:13)

使用spring框架實現數據庫事務處理方式

PS:

這篇僅用事務回滾為例,了解 spring 事務控制,還需要關注數據庫的ACID四種特性、事務傳播特性、事務的隔離級別(臟讀、不可重復讀、幻讀)。

以上為個人經驗,希望能給大家一個參考,也希望大家多多支持服務器之家。

原文鏈接:https://blog.csdn.net/qq_41691210/article/details/110734716

延伸 · 閱讀

精彩推薦
  • Java教程xml與Java對象的轉換詳解

    xml與Java對象的轉換詳解

    這篇文章主要介紹了xml與Java對象的轉換詳解的相關資料,需要的朋友可以參考下...

    Java教程網2942020-09-17
  • Java教程Java8中Stream使用的一個注意事項

    Java8中Stream使用的一個注意事項

    最近在工作中發現了對于集合操作轉換的神器,java8新特性 stream,但在使用中遇到了一個非常重要的注意點,所以這篇文章主要給大家介紹了關于Java8中S...

    阿杜7482021-02-04
  • Java教程升級IDEA后Lombok不能使用的解決方法

    升級IDEA后Lombok不能使用的解決方法

    最近看到提示IDEA提示升級,尋思已經有好久沒有升過級了。升級完畢重啟之后,突然發現好多錯誤,本文就來介紹一下如何解決,感興趣的可以了解一下...

    程序猿DD9332021-10-08
  • Java教程Java使用SAX解析xml的示例

    Java使用SAX解析xml的示例

    這篇文章主要介紹了Java使用SAX解析xml的示例,幫助大家更好的理解和學習使用Java,感興趣的朋友可以了解下...

    大行者10067412021-08-30
  • Java教程Java實現搶紅包功能

    Java實現搶紅包功能

    這篇文章主要為大家詳細介紹了Java實現搶紅包功能,采用多線程模擬多人同時搶紅包,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙...

    littleschemer13532021-05-16
  • Java教程小米推送Java代碼

    小米推送Java代碼

    今天小編就為大家分享一篇關于小米推送Java代碼,小編覺得內容挺不錯的,現在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧...

    富貴穩中求8032021-07-12
  • Java教程Java BufferWriter寫文件寫不進去或缺失數據的解決

    Java BufferWriter寫文件寫不進去或缺失數據的解決

    這篇文章主要介紹了Java BufferWriter寫文件寫不進去或缺失數據的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望...

    spcoder14552021-10-18
  • Java教程20個非常實用的Java程序代碼片段

    20個非常實用的Java程序代碼片段

    這篇文章主要為大家分享了20個非常實用的Java程序片段,對java開發項目有所幫助,感興趣的小伙伴們可以參考一下 ...

    lijiao5352020-04-06
主站蜘蛛池模板: 亚洲香蕉综合在人在线视看 | 日本videos有奶水的hd | 香蕉在线播放 | 色狠狠色狠狠综合天天 | 369看片网 | 欧美在线播放成人免费 | 精品老司机在线视频香蕉 | 91色porny | 婷婷色伊人 | 女教师波多野结衣高清在线 | 波多 在线播放 | 青青青青青国产免费手机看视频 | 亚洲swag精品自拍一区 | sss视频在线精品 | 特黄特黄aaaa级毛片免费看 | 午夜十八岁禁 | 羞羞漫画免费漫画页面在线看漫画秋蝉 | 青青草99热这里都是精品 | 交换性关系中文字幕6 | 奇米影视奇米色777欧美 | 国产免费看黄的私人影院 | 日韩伦理在线观看 | 国产高清一区二区 | 99精品久久精品一区二区小说 | 日本免费一区二区三区四区五六区 | 双性肉文高h| 我将她侵犯1~6樱花动漫在线看 | 秋葵丝瓜茄子草莓榴莲樱桃 | 色人阁图片 | 龟甲情感超市全文阅读 小说 | 日本色吧| 免费二级毛片免费完整视频 | 91传媒制片厂果冻有限公司 | 51午夜| 久久成人永久免费播放 | 出轨同学会免费观看 | 好吊色青青青国产综合在线观看 | 香蕉国产人午夜视频在线观看 | 青青成人 | 国产在线视频自拍 | 女同学用白丝脚玩我的故事 |