一、引言
上一篇文章,学习了AOP相关知识,并做了一个简单的Hello world。本文在上篇文章的基础上,进一步学习下Spring的声明式事务。
二、相关概念
1. 事务(Transaction)——它是一个操作序列,这些操作要么都执行,要么都不执行,它是一个不可分割的工作单位
2. 事务的几大特性(A、C、I、D):
A——Atomicity(原子性)。数据库中的事务执行是作为原子。即不可再分,整个语句要么执行,要么不执行。
C——Consistency(一致性)。在事务开始之前和事务结束以后,数据库的完整性约束没有被破坏。
I——Isolation(隔离性)。事务的执行是互不干扰的,一个事务不可能看到其他事务运行时,中间某一时刻的数据。
D——Durability(持久性)。事务完成后,对数据库所作的更改便持久的保存在数据库之中,并不会被回滚。
3.spring中事务有以下5中属性:
(1)传播行为。即事务的传递,例如:
PROPAGATION_MANDATORY:该方法必须运行在一个事务中。如果当前事务不存在则抛出异常。
PROPAGATION_NEVER:当前方法不应该运行在一个事务中。如果当前存在一个事务,则抛出异常.
PROPAGATION_REQUIRED:该方法必须运行在一个事务中。如果一个事务正在运行,该方法将运行在这个事务中。否则,就开始一个新的事务。
...
(2)隔离级别。多个事务并发执行,会产生脏读,不可重复读,幻读等问题,为避免这些问题,常常会设置隔离级别
(3)只读。主要用于优化
(4)超时。释放资源
(5)回滚规则。
4.多个事务并发运行,产生的问题:
(1)脏读(Dirty read)。当事务读取还未被提交的数据时。(读未提交)
(2)不可重复读(Nonrepeatable read)。同一个事务中两次读取同一数据,每次得到的数据都不一样。(读不回去,其他事务是更新操作)
(3)幻读(Phantom read)。一个事务在进行相同条件的两次或两次以上查询,结果在稍后的相同条件的查询中读取的结果不一样,会发现原来没有的记录。(读多了,其他事务是插入操作)
5.隔离级别:
(1)读未提交(Read Uncommitted,ansi sql值:1 ).允许脏读取,但不允许更新丢失。
(2)读已提交(Read Committed,ansi sql值:2 ).允许不可重复度,但不允许脏读取。
(3)可以重复读(Repeatable Read,ansi sql值:4 ).禁止不可重复读和脏读取,但是有时可能出现幻影数据。
(4)串行化(Serializable,ansi sql值:8 ).提供严格的事务隔离。它要求事务序列化执行,不支持并发。
6.spring的事务机制主要有两种:编程式事务和声明式事务。
编程式事务:所谓编程式事务指的是通过编码方式实现事务,即类似于JDBC编程实现事务管理。
声明式事务:在Spring中,主要是通过AOP来完成声明式的事务管理。
三、实例
1.建库建表。使用MySQL新建TEST库,然后新建CUSTOMER表。脚本如下:
1 CREATE TABLE `customer` ( 2 `RECID` int(10) NOT NULL AUTO_INCREMENT, 3 `NAME` varchar(100) NOT NULL, 4 `AGE` int(3) NOT NULL, 5 PRIMARY KEY (`RECID`) 6 )
2.新建项目,并引入相关jar包
项目结构:
pom.xml:
1 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 2 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> 3 <modelVersion>4.0.0</modelVersion> 4 <groupId>com.wzhang</groupId> 5 <artifactId>spring-demo</artifactId> 6 <packaging>war</packaging> 7 <version>0.0.1-SNAPSHOT</version> 8 <name>spring-demo Maven Webapp</name> 9 <url>http://maven.apache.org</url> 10 <properties> 11 <junit.version>3.8.1</junit.version> 12 <log4j.version>1.2.17</log4j.version> 13 <javax.servlet.version>2.5</javax.servlet.version> 14 <org.hibernate.version>4.1.7.Final</org.hibernate.version> 15 <org.springframework.version>3.2.3.RELEASE</org.springframework.version> 16 <org.apache.struts.version>2.3.16.3</org.apache.struts.version> 17 </properties> 18 <dependencies> 19 <dependency> 20 <groupId>junit</groupId> 21 <artifactId>junit</artifactId> 22 <version>${junit.version}</version> 23 <scope>test</scope> 24 </dependency> 25 <dependency> 26 <groupId>javax.servlet</groupId> 27 <artifactId>servlet-api</artifactId> 28 <version>${javax.servlet.version}</version> 29 </dependency> 30 <!-- Spring --> 31 <dependency> 32 <groupId>org.springframework</groupId> 33 <artifactId>spring-beans</artifactId> 34 <version>${org.springframework.version}</version> 35 </dependency> 36 <dependency> 37 <groupId>org.springframework</groupId> 38 <artifactId>spring-context</artifactId> 39 <version>${org.springframework.version}</version> 40 </dependency> 41 <dependency> 42 <groupId>org.springframework</groupId> 43 <artifactId>spring-core</artifactId> 44 <version>${org.springframework.version}</version> 45 </dependency> 46 47 <dependency> 48 <groupId>org.springframework</groupId> 49 <artifactId>spring-web</artifactId> 50 <version>${org.springframework.version}</version> 51 </dependency> 52 <dependency> 53 <groupId>org.springframework</groupId> 54 <artifactId>spring-expression</artifactId> 55 <version>${org.springframework.version}</version> 56 </dependency> 57 <dependency> 58 <groupId>org.springframework</groupId> 59 <artifactId>spring-aop</artifactId> 60 <version>${org.springframework.version}</version> 61 </dependency> 62 <dependency> 63 <groupId>org.springframework</groupId> 64 <artifactId>spring-orm</artifactId> 65 <version>${org.springframework.version}</version> 66 </dependency> 67 <dependency> 68 <groupId>org.springframework</groupId> 69 <artifactId>spring-tx</artifactId> 70 <version>${org.springframework.version}</version> 71 </dependency> 72 73 <!-- Hibernate --> 74 <dependency> 75 <groupId>org.hibernate</groupId> 76 <artifactId>hibernate-core</artifactId> 77 <version>${org.hibernate.version}</version> 78 </dependency> 79 80 <!-- Log4j --> 81 <dependency> 82 <groupId>log4j</groupId> 83 <artifactId>log4j</artifactId> 84 <version>${log4j.version}</version> 85 </dependency> 86 87 <!-- MySQL --> 88 <dependency> 89 <groupId>mysql</groupId> 90 <artifactId>mysql-connector-java</artifactId> 91 <version>5.1.25</version> 92 </dependency> 93 94 <!-- AOP --> 95 <dependency> 96 <groupId>aopalliance</groupId> 97 <artifactId>aopalliance</artifactId> 98 <version>1.0</version> 99 </dependency> 100 <dependency> 101 <groupId>org.aspectj</groupId> 102 <artifactId>aspectjweaver</artifactId> 103 <version>1.7.2</version> 104 </dependency> 105 106 <!-- annotation --> 107 <dependency> 108 <groupId>javax.annotation</groupId> 109 <artifactId>jsr250-api</artifactId> 110 <version>1.0</version> 111 </dependency> 112 </dependencies> 113 <build> 114 <finalName>spring-demo</finalName> 115 </build> 116 </project>