数据库事务并发问题在Spring中,可以在
元素的scope属性里设置bean的作用域,以决定这个bean
是单实例的还是多实例的。
默认情况下,Spring 只为每个在I0C容器里声明的bean创建唯一一个实例, 整个I0C
容器范围内都能共享该实例:所有后续的getBean()调用和bean引用都将返回这个唯一的
bean实例。该作用域被称为singleton,它是所有bean的默认作用域。
假设现在有两个事务T1和T2并发执行
1)脏读:脏读又称无效数据的读出,是指在数据库访问中,事务T1将某一值修改,然后事务T2读取该值,此后T1因为某种原因撤销对该值的修改,这就导致了T2所读取到的数据是无效的,值得注意的是,脏读一般是针对于update操作的。2)不可重复读:不可重复读,是指在数据库访问中,由于其他事务提交的修改引起的,一个事务范围内两个相同的查询却返回了不同数据。a.T1将某条记录的AGE值从20改为30
b.T2读取了T1更新后的值30
c.T1回滚,AGE恢复到20
d.T2读取到的30是一个无效值
3)幻读:幻读指当用户读取某一范围的数据行时,另一个事务又在该范围内插入了新行,当用户再读取该范围的数据行时,会发现有新的“幻影”a.T1读取AGE值为20
b.T2将AGE值改为30
c.T1再次读取AGE值为30,和第一次读取不一样
隔离级别a.T1读取了S表中的一部分数据
b.T2向S表中插入了新的行
c.T1读取S表出现了新的行
数据库系统必须具有隔离并发运行各个事务的能力,使他们互不影响,避免发各种并发问题。一个事务与其他事务隔离的程度称为隔离级别。SQL标准中规定了多种事务隔离级别,不同隔离级别对应不同的干扰程度,隔离级别越高,数据一致性就越好,但并发性越弱
中文乱码问题读未提交:允许T1读取T2未提交的修改
读已提交:要求T1只能读取T2已提交的修改
可重复读:确保T1可以从一个字段中读取到相同的值,即T1执行期间禁止其他事务对这个字段更新
串行化:确保T1可以多次从一个表中读取到相同的行,在T1执行期间,禁止其他事务对这个表进行添加、更新、删除操作。可以避免任何并发问题,但性能十分低下
在web.xml中配置过滤器CharacterEncodingFilter,将过滤器初始化参数encoding改为UTF-8,forceEncoding=true 是强制所有的请求响应都使用encoding编码
SpringMVC工作流程
Mybaits实体类中属性名和表字段中属性名不同时的解决方法
1.在SQL语句中起别名
2.在Mybatis-config中开启驼峰命名规则
3.在Mapper映射文件中使用resultMap来自定义映射规则



