搭建项目
pom文件
4.0.0
com.snail.test
Spring-MVC
1.0-SNAPSHOT
war
org.projectlombok
lombok
${lombok.version}
javax.validation
validation-api
${validation-api.version}
org.hibernate
hibernate-validator
${hibernate-validator.version}
junit
junit
${junitversion}
test
org.springframework
spring-aop
${springversion}
jar
compile
org.springframework
spring-aspects
${springversion}
jar
compile
org.springframework
spring-beans
${springversion}
jar
compile
org.springframework
spring-context
${springversion}
jar
compile
org.springframework
spring-context-support
${springversion}
jar
compile
org.springframework
spring-core
${springversion}
jar
compile
com.fasterxml.jackson.core
jackson-core
2.4.1
com.fasterxml.jackson.core
jackson-databind
2.4.1.1
org.springframework
spring-expression
${springversion}
jar
compile
org.springframework
spring-jdbc
${springversion}
jar
compile
org.springframework
spring-jms
${springversion}
jar
compile
org.springframework
spring-orm
${springversion}
jar
compile
org.springframework
spring-oxm
${springversion}
jar
compile
org.springframework
spring-tx
${springversion}
jar
compile
org.springframework
spring-web
${springversion}
jar
compile
org.springframework
spring-webmvc
${springversion}
jar
compile
org.springframework
spring-test
${springversion}
jar
compile
javax.servlet
jstl
1.2
jar
compile
commons-collections
commons-collections
3.1
commons-logging
commons-logging
1.1
commons-dbcp
commons-dbcp
1.4
mysql
mysql-connector-java
5.1.12
UTF-8
4.1.0.RELEASE
3.8.1
1.7
5.2.4.Final
1.1.0.Final
1.14.8
src/main/resources
true
src/test/resources
true
org.apache.maven.plugins
maven-compiler-plugin
3.1
${project.build.sourceEncoding}
${project.jdk.version}
org.apache.maven.plugins
maven-resources-plugin
2.4.3
${project.build.sourceEncoding}
dat
xls
xlsx
org.apache.maven.plugins
maven-source-plugin
2.2.1
true
install
jar
org.apache.maven.plugins
maven-compiler-plugin
org.apache.maven.plugins
maven-resources-plugin
jdbc.properties
jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/student
jdbc.username=root
jdbc.password=root
dispatch-servlet
web.xml
hello
org.springframework.web.context.ContextLoaderListener
contextConfigLocation
classpath:applicationContext.xml
CharacterEncodingFilter
org.springframework.web.filter.CharacterEncodingFilter
encoding
utf-8
CharacterEncodingFilter
/*
dispatcher
org.springframework.web.servlet.DispatcherServlet
contextConfigLocation
classpath:transaction_dispatcher-servlet.xml
0
dispatcher
/
index.jsp
service
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Controller;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RequestMapping;
import java.sql.SQLException;
@Controller
public class UserService {
@Autowired
private JdbcTemplate jdbcTemplate;
@RequestMapping("/login")
@Transactional
public String login(String userName, String password) throws Exception {
String sql = "UPDATE student SET name = ? WHERE id = ? ";
jdbcTemplate.update(sql, "111", 2);
if (isRightUser(userName, password)) {
sql = "UPDATE student SET name = ? WHERE id = ? ";
jdbcTemplate.update(sql, "222", 2);
return "success";
} else {
return "fail";
}
}
private boolean isRightUser(String userName, String password) throws Exception {
throw new SQLException();
// return true;
}
}
注意点
@Transactional
事务传播行为:PROPAGATION_REQUIRED
事务隔离级别:ISOLATION_DEFAULT
读写事务属性:读/写事务
超时时间:依赖底层事务系统的默认值
回滚设置:任何运行期异常引发回滚,任何检查型异常不会引发回滚
read-only="true"
概念:从这一点设置的时间点开始(时间点a)到这个事务结束的过程中,其他事务所提交的数据,该事务将看不见!(查询中不会出现别人在时间点a之后提交的数据)
应用场合
一次执行单条查询语句,则没有必要启用事务支持,数据库默认支持SQL执行期间的读一致性;
一次执行多条查询语句,例如统计查询,报表查询,在这种场景下,多条查询SQL必须保证整体的读一致性,否则,在前条SQL查询之后,后条SQL查询之前,数据被其他用户改变,则该次整体的统计查询将会出现读数据不一致的状态,此时,应该启用事务支持。
注意是一次执行多次查询来统计某些信息,这时为了保证数据整体的一致性,要用只读事务
怎样设置:
对于只读查询,可以指定事务类型为readonly,即只读事务。
由于只读事务不存在数据的修改,因此数据库将会为只读事务提供一些优化手段,例如Oracle对于只读事务,不启动回滚段,不记录回滚log。
- 注解 @Transactional(readOnly = true)
在将事务设置成只读后,相当于将数据库设置成只读数据库,此时若要进行写的操作,会出现错误。