web.xml
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<filter>
<filter-name>struts2</filter-name>
<filter-class>
org.apache.struts2.dispatcher.FilterDispatcher
</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<servlet>
<servlet-name>LogServlet</servlet-name>
<servlet-class>com.turing.framework.servlet.LogServlet</servlet-class>
<init-param>
<param-name>log4j</param-name>
<param-value>/WEB-INF/classes/log4j.properties</param-value>
</init-param>
<load-on-startup>0</load-on-startup>
</servlet>
顺序: listener -->filter-->servlet
listener干嘛?
filter ? 注意先后顺序
servlet ?
spring JPA(hibbrean)
------a,b方法两个事务管理------------------------------------>传播机制
@Transaction
void a()
{
b();
}
@Transaction
void b()
b回滚a也会回滚
a回滚b不会回滚
项目遇到事务错误:
-------1----------
A a = MeObject.findById();//从数据库中查出的一对象
processA(a);
@Transaction
void processA(A a)
{
//针对a的一系列持久化操作
}
现象:针对a所有操作都不会入库
原因:a是一个传参,属于一个托管对象,没有受spring 的管理,所以即使其在事务中,也不会持久化
解决方案:
@Transaction
void processA(A a)
{
a.update();
//针对a的一系列持久化操作
}
-------2----no session---软加载---
b为a的一个成员变量,数据库中的体现为a表中存在b的外键
@Transaction
void noSess()
{
A a = MeObject.findById();//从数据库中查出的一对象
B b =a.b
b.exectue();//持久化操作
}
@Transaction
void noSess()
{
A a = MeObject.findById();//从数据库中查出的一对象
a.b.getId();
B b =a.b
b.exectue();//持久化操作
}
----3-----事务里不能起线程----
@Transaction
void operateSuperThread()
{
o.save();
o.deploy();--起一个线程也做持久化操作
}
-------事务对staic method无效
Aspk 编译期 加前后置代码
运行期 在二进制码中加前后置逻辑处理
动态代理 JDK 被 代码 的类 必须 实现 至少一个接口
class A impl SupA {
void exectue(){
//持久化操作
}
}
SupA a = new A(); 类型为SupA 不能为A
cglib 通过继承该类
class ExtA imp A {
@over
void exectue()
{
preTraProcess();
supper.exectue();
postTraProcess();
}
}
选择代码级事务管理 还是声明式事务管理 决定程序是需要有严密的控制,精确捷控制事务的边界,还是选择方便而声明到一个上下文环境即可
传播行为在尊重客户端和调用的方法的基础上来定义事务的边界的
隔离级别:多事务并发时,同时操作同一数据,防止如下情况:
DIrty read 脏读:A事务在读取数据,但B事务在改写这些数据只是还没提交,若这个改写被回滚,那A读出的数据就是无效地。
Nomrepeatable read 不可重复读:当一个事务执行同一个查询命令时两次以上,介理每次查询的数据都不一样,不可重复读就发生,通常是因为另外一个并发的事务在几次查询之间下大更新数据造成的
Phantom reads 虚读:A事务读了几行数据,然后B事务插入了几行,在后来的查询中,A发现以前不存在的那些行
各种隔离方式为何能达到不同的效果???
事务属性通常由事务的传播行为,事务的隔离级别,事务的超时值和事务只读标志组成
未完待续
参考内容:http://www.iteye.com/topic/78674