事务基础,数据库意外,隔离级别及jdbc配置事务

5 篇文章 0 订阅
4 篇文章 0 订阅

1.事物
原子性,一致性,隔离性,持久性
Atomicity:事物的所有操作要么全部成功,要么全部回滚
Consistency:执行前后数据遵循完整约束
Isolation:对于某一时间段中同时存在的事物,在某一个事物看来,该事物执行前后不存在其他事物
Durability:一旦提交,永久改变
2.几种数据库意外
第一类丢失更新(lest update)
百度百度百度
A撤销时将B的更改也撤销了
标准定义的所有隔离界别都不允许第一类丢失更新发生
不可重复读(unrepeatable read)
在这里插入图片描述
在A两次查询间隙,B提交了更改事务,使得A查到的数据不同
脏读(dirty read)
百度百度百度
由于B的回滚,A读到了无效数据
幻读(phantom read)
百度百度百度
在A的两次查询间隙,B添加并提交了一条新记录
第二类丢失更新(second lost update)
百度百度百度
由于A操作间隙中B的更改并提交,B的操作被覆盖了
第二类丢失更新也是不允许的
3.隔离级别
百度百度百度
4.jdbc配置事务
a.导入依赖

<dependency>
			<groupId>junit</groupId>
			<artifactId>junit</artifactId>
			<version>4.0</version>
			<scope>test</scope>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-aop</artifactId>
			<version>${spring-version}</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-tx</artifactId>
			<version>${spring-version}</version>
		</dependency>
		<dependency>
			<groupId>org.aspectj</groupId>
			<artifactId>aspectjweaver</artifactId>
			<version>1.8.14</version>
</dependency>

2.配置一个tx事务代理 jdbc

<!-- jdbc事务代理开始 -->
	<bean id="txManager"
		class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
		<property name="dataSource" ref="dataSource" />
	</bean>
<!-- jdbc事务代理结束 -->
<!-- 事务通知开始-->
<tx:advice id="txAdvice" transaction-manager="txManager"> 
		<tx:attributes>
			<tx:method name="find*" read-only="true"/>         
			<tx:method name="add*" propagation="REQUIRED"/>      
			<tx:method name="update*" propagation="REQUIRED"/>
			<tx:method name="del*" propagation="REQUIRED"/>
		</tx:attributes>
</tx:advice>
<!-- 事务通知结束-->

3.添加事务切入点

<!-- aop注入开始 -->
	<context:component-scan
		base-package="com.hxzy.spring.aop ">
	</context:component-scan>
	<aop:aspectj-autoproxy></aop:aspectj-autoproxy>
	<bean id="bxAop" class="com.hxzy.spring.aop.BxAop"></bean>
	<!-- aop配置开始 -->
	<aop:config>
		<aop:aspect ref="bxAop">
			<aop:pointcut id="bxcut"
				expression="execution(* com.hxzy.spring.service.impl.*.*(..))"></aop:pointcut>
			<aop:before method="BxBefore" pointcut-ref="bxcut"></aop:before>
			<aop:after method="BxAfter" pointcut-ref="bxcut"></aop:after>
		</aop:aspect>
	</aop:config>
	<!-- aop配置结束 -->
	<!-- aop注入结束 -->
  1. 注入jdbctemplate
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
			<constructor-arg ref="dataSource"/>
	</bean>
	
	private JdbcTemplate jdbcTemplate;
	@Resource
	public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
		this.jdbcTemplate = jdbcTemplate;
	}

5.jdbcTemplate.execute(sql)

===========================================================================
使用注解

<tx:annotation-driven />

<bean id="transactionManager"
	class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
	<property name="dataSource" ref="dataSource" />
</bean>

注意:id的名字必须要为transactionManager 否则找不到
在类上面加一个
@Component

在你要操作的方法上面添加一个

@Transactional

===================================

如果tx的属性设置为readonly = true
那么在mysql下执行插入更新和删除操作是会报错

oracle底层暂时不进行支持

====================================
额外资料
propagation=Propagation.REQUIRED 参数设置
isolation=Isolation.DEFAULT 参数设置
百度百度百度
下附上具体代码

pom-xml
<project xmlns="http://maven.apache.org/POM/4.0.0"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>

	<groupId>com.spring</groupId>
	<artifactId>affair</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<packaging>jar</packaging>

	<name>affair</name>
	<url>http://maven.apache.org</url>

	<properties>
		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
		<spring-version>4.0.0.RELEASE</spring-version>
	</properties>

	<dependencies>
	<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-beans</artifactId>
			<version>${spring-version}</version>
		</dependency>

		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-context</artifactId>
			<version>${spring-version}</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-jdbc</artifactId>
			<version>${spring-version}</version>
		</dependency>
		<dependency>
			<groupId>com.oracle</groupId>
			<artifactId>jdbc</artifactId>
			<version>11.2.0.1.0</version>
		</dependency>
		<dependency>
			<groupId>commons-dbcp</groupId>
			<artifactId>commons-dbcp</artifactId>
			<version>1.4</version>
		</dependency>
		<dependency>
			<groupId>junit</groupId>
			<artifactId>junit</artifactId>
			<version>4.0</version>
			<scope>test</scope>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-aop</artifactId>
			<version>${spring-version}</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-tx</artifactId>
			<version>${spring-version}</version>
		</dependency>
		<dependency>
			<groupId>org.aspectj</groupId>
			<artifactId>aspectjweaver</artifactId>
			<version>1.8.14</version>
		</dependency>
	</dependencies>
</project>

beans-xml
<?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:aop="http://www.springframework.org/schema/aop"
	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/context
        http://www.springframework.org/schema/context/spring-context.xsd
        http://www.springframework.org/schema/aop 
        http://www.springframework.org/schema/aop/spring-aop.xsd
        http://www.springframework.org/schema/tx
        http://www.springframework.org/schema/tx/spring-tx.xsd
        ">
	<!-- 注释开始 -->
	<context:annotation-config></context:annotation-config>
	<!-- 注释结束 -->
	<!-- 接口注入开始 -->
	<context:component-scan
		base-package="com.hxzy.affair" scoped-proxy="interfaces"></context:component-scan>
	<bean name="userDaoImpl" class="com.hxzy.affair.dao.impl.UserDaoImpl"
		scope="singleton" autowire="byType"></bean>
	<bean name="userService"
		class="com.hxzy.affair.service.impl.UserServiceImpl" scope="singleton"
		autowire="byType"></bean>
	<!-- 接口注入结束 -->
	<!--导aop开始 -->
	<import resource="spring-aop.xml" />
	<!--导aop结束 -->
	<!-- 数据源开始 -->
	<bean id="dataSource"
		class="org.springframework.jdbc.datasource.DriverManagerDataSource">
		<property name="driverClassName"
			value="${jdbc.driverClassName}" />
		<property name="url" value="${jdbc.url}" />
		<property name="username" value="${jdbc.username}" />
		<property name="password" value="${jdbc.password}" />
	</bean>
	<context:property-placeholder
		location="jdbc.properties" />
	<!-- 数据源结束 -->
	<!-- jdbc事务代理开始 -->
	<bean id="txManager"
		class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
		<property name="dataSource" ref="dataSource" />
	</bean>
	<!-- jdbc事务代理结束 -->
	<!-- 事务通知开始 -->
	<tx:advice id="txAdvice" transaction-manager="txManager">
		<tx:attributes>
			<tx:method name="find*" read-only="true" />
			<tx:method name="add*" propagation="REQUIRED" />
			<tx:method name="update*" propagation="REQUIRED" />
			<tx:method name="del*" propagation="REQUIRED" />
		</tx:attributes>
	</tx:advice>
	<!-- 事务通知结束 -->
	<!-- jdbctemplate注入开始 -->
	<bean id="jdbcTemplate"
		class="org.springframework.jdbc.core.JdbcTemplate">
		<constructor-arg ref="dataSource" />
	</bean>
	<!-- jdbctemplate注入结束 -->
</beans>
aop-xml
<?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: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/context
        http://www.springframework.org/schema/context/spring-context.xsd
        http://www.springframework.org/schema/aop 
        http://www.springframework.org/schema/aop/spring-aop.xsd
        ">
	<!-- 注释开始 -->
	<context:annotation-config></context:annotation-config>
	<!-- 注释结束 -->
	<!-- aop注入开始 -->
	<context:component-scan
		base-package="com.hxzy.affair.aop ">
	</context:component-scan>
	<aop:aspectj-autoproxy></aop:aspectj-autoproxy>
	<bean id="bxAop" class="com.hxzy.affair.aop.BxAop"></bean>
	<!-- aop配置开始 -->
	<aop:config>
		<aop:aspect ref="bxAop">
			<aop:pointcut id="bxcut"
				expression="execution(* com.hxzy.affair.service.impl.*.*(..))"></aop:pointcut>
			<aop:before method="BxBefore" pointcut-ref="bxcut"></aop:before>
			<aop:after method="BxAfter" pointcut-ref="bxcut"></aop:after>
		</aop:aspect>
	</aop:config>
	<!-- aop配置结束 -->
	<!-- aop注入结束 -->
</beans>
测试代码
public class Test1 {
	@Test
	public void tefs() {
		User user = new User();
		user.setUserName("bx");
		user.setPassword("dgv");
		BeanFactory bean = new ClassPathXmlApplicationContext("./spring-bean.xml");
		UserServiceImpl userServiceImpl = (UserServiceImpl) bean.getBean("userService");
		userServiceImpl.addUser(user);
		List<User> list = new ArrayList<User>();
		list = userServiceImpl.findUser();
		System.out.println("adminname\t\tpassword");
		for(User u :list) {
			System.out.println(u.getUserName()+"\t\t\t"+u.getPassword());
		}
	}
}

dao层
@Configuration
@ImportResource("classpath:spring-bean.xml")
public class UserDaoImpl implements UserDao {
	private JdbcTemplate jdbcTemplate;
	private DataSource dataSource;

	public DataSource getDataSource() {
		return dataSource;
	}

	/**
	 * 数据源
	 */
	@Resource
	public void setDataSource(DataSource dataSource) {
		this.dataSource = dataSource;
	}

	public JdbcTemplate getJdbcTemplate() {
		return jdbcTemplate;
	}

	/**
	 * jdbc代理
	 */
	@Resource
	public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
		this.jdbcTemplate = jdbcTemplate;
	}

	@Override
	@Transactional
	public void addUser(User user) {
		// sql
		String sql = "insert into admin (adminname,password) values('" + user.getUserName() + "','" + user.getPassword()
				+ "')";
		System.out.println("addUser");
		jdbcTemplate.execute(sql);
	}

	@Override
	public List<User> findUser() {
		// TODO Auto-generated method stub
		List<User> list = this.jdbcTemplate.query("select * from admin", new RowMapper<User>() {
			public User mapRow(ResultSet rs, int rowNum) throws SQLException {
				User user = new User();
				user.setUserName(rs.getString("adminname"));
				user.setPassword(rs.getString("password"));
				return user;
			}
		});
		return list;
	}
}

结果集
百度百度百度
百度百度百度

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值