当前位置: 首页 > news >正文

电子商务网站的优点有那些石河子市住房和城乡建设局网站

电子商务网站的优点有那些,石河子市住房和城乡建设局网站,设计师培训基地,爱情网站设计目录 回顾Mybatis和新对象思路整理 Spring和MyBatis的整合步骤1. 创建Web工程#xff0c;导入Spring和MyBatis的相关依赖2. 建立开发目录结构#xff0c;创建实体类3. 创建数据访问接口和SQL映射语句文件4. 使用Spring配置文件配置数据源4.1 database.properties4.2spring配置… 目录 回顾Mybatis和新对象思路整理 Spring和MyBatis的整合步骤1. 创建Web工程导入Spring和MyBatis的相关依赖2. 建立开发目录结构创建实体类3. 创建数据访问接口和SQL映射语句文件4. 使用Spring配置文件配置数据源4.1 database.properties4.2spring配置文件applicationContext.xml 5. 使用Spring配置文件创建SqlSessionFactory6. 配置MyBatis应用配置文件mybatis-config.xml7. 创建业务接口和业务实现类8.配置扫描扫描service层bean9.配置MapperScannerConfigurer10. 测试 spring整合Mybatis后的事务处理声明式事务示例配置方式本章主要用注解来实现声明式事务 Spring声明式事务对应事务管理器接口 注解实现声明式事务Transactional的工作原理添加注解配置 propagation事务传播机制REQUIRED默认值SUPPORTSREQUIRES_NEWMANDATORYNESTEDNOT_SUPPORTEDNEVER 并发场景下事务引发的问题脏读Dirty Read产生原因解决方案总结 丢失修改Lost of Modify产生原因解决方案总结 死锁Deadlock产生原因解决方案总结 不可重复读Unrepeatableread)产生原因解决方案总结 幻读Phantom read产生原因解决方案总结 Spring声明式事务中的事务隔离isolationDEFAULT默认值READ_COMMITTED读已提交READ_UNCOMMITTED读未提交REPEATABLE_READ可重复读SERIALIZABLE可串行化 补充事务属性 回顾Mybatis和新对象 倒着来看 执行mapper.xml中的SQL需要先有sqlSession对象sqlSession对象需要sqlSessionFactory创建sqlSessionFactory需要SqlSessionFactoryBuilder创建SqlSessionFactoryBuilder需要自己new出来即使是sqlSession对象在使用时也是跟业务代码紧耦合的 思路整理 spring解决的就是手动new 对象和紧耦合的问题何况Mybatis核心中的这些对象呢以上流程可以全部移交给Spring来处理读取配置文件、组件的创建、组件之间的依赖关系以及整个框架的生命周期都由Spring容器统一管理Spring框架整合其他框架的本质就是通过IOC和AOP把其他框架交给Spring框架管理最终建立一个低耦合的应用架构 Spring和MyBatis的整合步骤 1. 创建Web工程导入Spring和MyBatis的相关依赖 !--数据库驱动--dependencygroupIdmysql/groupIdartifactIdmysql-connector-java/artifactIdversion5.1.47/version/dependency!-- 阿里数据库连接池 --dependencygroupIdcom.alibaba/groupIdartifactIddruid/artifactIdversion1.0.9/version/dependency!--Mybatis--dependencygroupIdorg.mybatis/groupIdartifactIdmybatis/artifactIdversion3.5.2/version/dependency!--日志包--dependencygroupIdorg.slf4j/groupIdartifactIdslf4j-log4j12/artifactIdversion1.7.25/version/dependencydependencygroupIdlog4j/groupIdartifactIdlog4j/artifactIdversion1.2.17/version/dependencydependencygroupIdorg.projectlombok/groupIdartifactIdlombok/artifactIdversion1.18.22/versionscopeprovided/scope/dependency!-- spring --dependencygroupIdorg.springframework/groupIdartifactIdspring-web/artifactIdversion5.1.9.RELEASE/version/dependencydependencygroupIdorg.springframework/groupIdartifactIdspring-webmvc/artifactIdversion5.1.9.RELEASE/version/dependency!-- aop依赖 --dependencygroupIdorg.aspectj/groupIdartifactIdaspectjweaver/artifactIdversion1.9.6/version/dependencydependencygroupIdorg.springframework/groupIdartifactIdspring-jdbc/artifactIdversion5.1.9.RELEASE/version/dependency!-- springmybatis整合 --dependencygroupIdorg.mybatis/groupIdartifactIdmybatis-spring/artifactIdversion2.0.2/version/dependency2. 建立开发目录结构创建实体类 package cn.smbms.pojo;import lombok.Data; import lombok.ToString; import java.io.Serializable; import java.util.Date;/*** author: zjl* datetime: 2024/3/23* desc:*/ Data ToString public class User implements Serializable {private long id;private String userCode;private String userName;private String userPassword;private int gender;private Date birthday;private String phone;private String address;private int userRole; }3. 创建数据访问接口和SQL映射语句文件 package cn.smbms.mapper;public interface UserMapper {int selectUserCount(); }?xml version1.0 encodingUTF-8 ? !DOCTYPE mapperPUBLIC -//mybatis.org//DTD Mapper 3.0//ENhttp://mybatis.org/dtd/mybatis-3-mapper.dtd mapper namespacecn.smbms.mapper.UserMapperselect idselectUserCount resultTypeintSELECT COUNT(1) FROM SMBMS_USER/select /mapper4. 使用Spring配置文件配置数据源 4.1 database.properties jdbc.driverClassName com.mysql.jdbc.Driver jdbc.url jdbc:mysql://localhost:3306/smbms?useSSLfalsecharacterEncodingutf-8 jdbc.username root jdbc.password 123456 maxActive20 initialSize1 maxWait60000 minIdle1 timeBetweenEvictionRunsMillis60000 minEvictableIdleTimeMillis300000 testWhileIdletrue testOnBorrowfalse testOnReturnfalse filtersstat4.2spring配置文件applicationContext.xml !--引入properties文件--bean classorg.springframework.context.support.PropertySourcesPlaceholderConfigurerproperty namelocationvalueclasspath:database.properties/value/property/bean!--配置DataSource-- !-- bean iddataSource classorg.apache.commons.dbcp.BasicDataSource destroy-methodclose--bean iddataSource classcom.alibaba.druid.pool.DruidDataSource destroy-methodcloseproperty namedriverClassName value${jdbc.driverClassName} /property nameurl value${jdbc.url}/property nameusername value${jdbc.username} /property namepassword value${jdbc.password} /!--最大连接池数量--property namemaxActive value${maxActive} /!--初始化时建立物理连接的个数--property nameinitialSize value${initialSize} /!--获取连接时最大等待时间单位毫秒--property namemaxWait value${maxWait} /!--最小连接池数量--property nameminIdle value${minIdle} /!--检测连接是否有效的超时时间单位秒--property nametimeBetweenEvictionRunsMillis value${timeBetweenEvictionRunsMillis} /!--连接保持空闲而不被驱逐的最小时间--property nameminEvictableIdleTimeMillis value${minEvictableIdleTimeMillis} /!--申请连接的时候检测--property nametestWhileIdle value${testWhileIdle} /!--申请连接时执行validationQuery检测连接是否有效做了这个配置会降低性能。--property nametestOnBorrow value${testOnBorrow} /!--归还连接时执行validationQuery检测连接是否有效做了这个配置会降低性能。--property nametestOnReturn value${testOnReturn} /!--属性类型是字符串通过别名的方式配置扩展插件--property namefilters value${filters} //bean5. 使用Spring配置文件创建SqlSessionFactory !-- 配置SqlSessionFactoryBean --bean idsqlSessionFactory classorg.mybatis.spring.SqlSessionFactoryBean!-- 引用数据源组件 --property namedataSource refdataSource /!-- 引用MyBatis配置文件中的配置 --property nameconfigLocation valueclasspath:mybatis/mybatis-config.xml /!-- 配置SQL映射文件信息 --property namemapperLocationslistvalueclasspath:mybatis/mapper/*.xml/value/list/property/bean6. 配置MyBatis应用配置文件mybatis-config.xml ?xml version1.0 encodingUTF-8 ? !DOCTYPE configurationPUBLIC -//mybatis.org//DTD Config 3.0//ENhttp://mybatis.org/dtd/mybatis-3-config.dtd !-- Mybatis核心配置文件 -- configurationsettingssetting namelogImpl valueLOG4J//settingstypeAliasespackage namecn.smbms.pojo//typeAliases /configuration7. 创建业务接口和业务实现类 package cn.smbms.service;public interface UserService {int getUserCount(); }package cn.smbms.service;import cn.smbms.mapper.UserMapper; import org.springframework.stereotype.Service;import javax.annotation.Resource;/*** author: zjl* datetime: 2024/4/16* desc:*/ Service public class UserServiceImpl implements UserService{Resourceprivate UserMapper userMapper;Overridepublic int getUserCount() {return userMapper.selectUserCount();} }8.配置扫描扫描service层bean context:component-scan base-packagecn.smbms.service/9.配置MapperScannerConfigurer 自动扫描指定包下的Mapper接口并将它们直接注册为MapperFactoryBean bean classorg.mybatis.spring.mapper.MapperScannerConfigurerproperty namebasePackage valuecn.smbms.mapper //bean10. 测试 package cn.smbms.test;import cn.smbms.service.UserService; import org.junit.Test; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext;/*** author: zjl* datetime: 2024/4/16* desc:*/ public class MyTest {Testpublic void test(){ApplicationContext act new ClassPathXmlApplicationContext(applicationContext.xml);UserService userService act.getBean(UserService.class);System.out.println(userService.getUserCount());} }spring整合Mybatis后的事务处理 编程式事务硬编码方式代码繁琐且破坏分层代码不易维护声明式事务采用AOP的方式实现Spring提供了声明式事务支持 声明式事务 声明式事务关注的核心问题是对哪些方法采取什么样的事务策略配置步骤 导入tx和aop命名空间定义事务管理器Bean并为其注入数据源Bean通过tx:advice配置事务增强绑定事务管理器并针对不同方法定义事务规则配置切面将事务增强与方法切入点组合 示例配置方式本章主要用注解来实现声明式事务 !-- 使用xml方式实现声明式事务 --tx:advice idtxAdvicetx:attributestx:method nameget* propagationSUPPORTS /tx:method nameadd* propagationREQUIRED /tx:method namedel* propagationREQUIRED /tx:method nameupdate* propagationREQUIRED /tx:method name* propagationREQUIRED //tx:attributes/tx:advice !-- 定义切面 --aop:configaop:pointcut idserviceMethodexpressionexecution(* cn.smbms.service..*.*(..)) /aop:advisor advice-reftxAdvice pointcut-refserviceMethod //aop:config !-- 定义事务管理器 --bean idtransactionManager classorg.springframework.jdbc.datasource.DataSourceTransactionManagerproperty namedataSource refdataSource/property/beanSpring声明式事务对应事务管理器接口 DataSourceTransactionManager类(事务管理器)中的主要方法 doBegin()开启事务doSuspend()挂起事务doResume()恢复挂起的事务doCommit()提交事务doRollback()回滚事务 注解实现声明式事务 Transactional注解添加声明式事务可以加在方法上表示对该方法实现声明式事务可以加载类上表示对该类中所有的方法实现声明式事务 Transactional的工作原理 Transactional是基于AOP实现的AOP又是基于动态代理实现的。如果目标对象实现了接口默认情况下就会采用JDK的动态代理如果目标对象没有实现接口会使用CGLIB的动态代理。Transactional在开始执行业务之前通过代理先开始事务在执行成功之后再提交事务。如果中途遇见异常则回滚事务。Transactional实现思路预览 Transactional具体执行细节如下图所示 添加注解配置 !--tx:advice idtxAdvicetx:attributestx:method nameget* propagationSUPPORTS /tx:method nameadd* propagationREQUIRED /tx:method namedel* propagationREQUIRED /tx:method nameupdate* propagationREQUIRED /tx:method name* propagationREQUIRED //tx:attributes/tx:advicelt;!ndash; 定义切面 ndash;gt;aop:configaop:pointcut idserviceMethodexpressionexecution(* cn.smbms.service..*.*(..)) /aop:advisor advice-reftxAdvice pointcut-refserviceMethod //aop:config--!-- 定义事务管理器 --bean idtransactionManager classorg.springframework.jdbc.datasource.DataSourceTransactionManagerproperty namedataSource refdataSource/property/bean!-- 使用注解实现声明式事务 --tx:annotation-driven /propagation事务传播机制 事务的传播机制解决的是一个事务在多个节点方法中传递的问题 REQUIRED默认值 REQUIRED是默认的事务传播行为。如果当前存在事务那么该方法将会在该事务中运行如果当前没有事务那么它会启动一个新的事务。 Service public class ServiceA {Autowiredprivate ServiceB serviceB;// 使用REQUIRED传播机制Transactional(propagation Propagation.REQUIRED)public void methodA() {// 方法A的业务代码...// 调用方法BserviceB.methodB();// 如果methodB出现错误那么methodA和methodB的操作都会回滚。} } Service public class ServiceB {Transactional(propagation Propagation.REQUIRED)public void methodB() {// 方法B的业务代码...} }SUPPORTS 如果当前存在事务那么该方法将会在该事务中运行如果当前没有事务那么它可以以非事务方式执行。 Service public class ServiceA {Autowiredprivate ServiceB serviceB;Transactional(propagation Propagation.SUPPORTS)public void methodA() {// 方法A的业务代码...serviceB.methodB();// 无论methodB是否出现错误methodA的操作都不会回滚。} }Service public class ServiceB {Transactional(propagation Propagation.SUPPORTS)public void methodB() {// 方法B的业务代码...} }REQUIRES_NEW REQUIRES_NEW传播行为总是会启动一个新的事务。如果有一个事务正在运行那么这个事务将会被挂起。 Service public class ServiceA {Autowiredprivate ServiceB serviceB;Transactional(propagation Propagation.REQUIRES_NEW)public void methodA() {// 方法A的业务代码...serviceB.methodB();// methodB在新的事务中运行无论是否出错都不会影响methodA的事务。} }Service public class ServiceB {Transactional(propagation Propagation.REQUIRES_NEW)public void methodB() {// 方法B的业务代码...} }MANDATORY MANDATORY传播行为要求方法必须在一个现有的事务中执行如果没有事务就抛出异常。 Service public class ServiceA {Autowiredprivate ServiceB serviceB;Transactional(propagation Propagation.MANDATORY)public void methodA() {// 方法A的业务代码...serviceB.methodB();// 如果没有现有事务会抛出异常。} }Service public class ServiceB {Transactional(propagation Propagation.MANDATORY)public void methodB() {// 方法B的业务代码...} }NESTED NESTED传播行为在一个嵌套事务中执行如果一个事务正在运行那么它将在一个嵌套事务中执行。这个嵌套事务是可以独立提交或回滚的。 Service public class ServiceA {Autowiredprivate ServiceB serviceB;Transactional(propagation Propagation.NESTED)public void methodA() {// 方法A的业务代码...serviceB.methodB();// methodB在嵌套事务中运行如果出错只有嵌套事务会回滚不会影响methodA的事务。} }Service public class ServiceB {Transactional(propagation Propagation.NESTED)public void methodB() {// 方法B的业务代码...} }NOT_SUPPORTED NOT_SUPPORTED传播行为总是以非事务方式执行如果有一个事务正在运行那么这个事务将会被挂起。 Service public class ServiceA {Autowiredprivate ServiceB serviceB;Transactional(propagation Propagation.NOT_SUPPORTED)public void methodA() {// 方法A的业务代码...serviceB.methodB();// 无论methodB是否出错methodA的操作都不会回滚因为它们不在同一个事务中。} }Service public class ServiceB {Transactional(propagation Propagation.NOT_SUPPORTED)public void methodB() {// 方法B的业务代码...} }NEVER NEVER传播行为要求方法以非事务方式执行如果有一个事务正在运行将会抛出异常。 Service public class ServiceA {Autowiredprivate ServiceB serviceB;Transactional(propagation Propagation.NEVER)public void methodA() {// 方法A的业务代码...serviceB.methodB();// 如果有事务正在运行会抛出异常。} }Service public class ServiceB {Transactional(propagation Propagation.NEVER)public void methodB() {// 方法B的业务代码...} }并发场景下事务引发的问题 在典型的应用程序中多个事务并发运行经常会操作相同的数据来完成各自的任务多个用户对统一数据进行操作。并发虽然是必须的但是可能会导致以下的问题。 脏读Dirty Read 当一个事务正在访问数据并且对数据进行了修改此时还未提交到数据库中这时另一个事务也访问并使用了这个数据由于上个事务还未提交此时他读到的就是“脏数据”根据“脏数据”所做的操作可能时不正确的。 产生原因 并发事务未提交 一个事务在进行更新操作但尚未提交时另一个事务已经读取了被更新的数据。这样读取到的数据就是未提交的“脏数据”。 缺乏事务隔离机制 如果数据库系统的事务隔离级别设置较低如读取未提交数据Read Uncommitted则允许事务读取到其他事务尚未提交的数据从而导致脏读问题。 解决方案 使用事务隔离级别 将数据库的事务隔离级别设置为合适的级别如可重复读Repeatable Read或串行化Serializable这样可以确保一个事务在读取数据时不会读取到其他事务尚未提交的数据从而避免脏读问题的发生。 加锁 在进行读取操作时可以使用行级锁或表级锁来锁定数据防止其他事务对数据进行修改确保读取到的数据是一致的。 优化事务设计 在设计应用程序时避免长时间持有事务或数据库连接尽量缩短事务的执行时间减少脏读发生的可能性。 谨慎使用未提交读Read Uncommitted 如果必须使用未提交读隔离级别应该在应用程序中谨慎使用并且清楚了解可能带来的风险。 总结 脏读问题可能导致系统产生错误的结果因此在设计和实现数据库系统时必须采取适当的措施来防止脏读的发生。通过设置合适的事务隔离级别、加锁以及优化事务设计可以有效地避免脏读问题确保系统的数据一致性和完整性 丢失修改Lost of Modify 指一个事务读取到一个数据另一个事务也访问了该数据。那么在第一个事务修改了这个数据后第二个事务也进行了修改此时第一个事务的修改结果就被覆盖了也就是丢失了因此称为丢失修改。 例如事务1读取某表中的数据A20事务2也读取A20事务1修改AA-1事务2也修改AA-1最终结果A19事务1的修改被丢失。当两个或多个事务同时修改同一数据时后提交的事务可能会覆盖前一个事务所做的修改导致前一个事务的更新被丢失这可能会导致数据不一致性或意外的结果 产生原因 并发更新 多个事务同时对同一数据进行更新操作由于没有正确的并发控制机制可能导致后提交的事务覆盖了先前事务的修改。缺乏锁机制 如果系统没有实现有效的锁机制来保护共享数据不同的事务可能会同时对同一数据进行修改从而导致丢失更新问题。 解决方案 使用锁机制 引入锁机制如行级锁或表级锁可以确保同时只有一个事务可以对特定的数据进行修改操作从而避免丢失更新的问题。乐观并发控制 采用乐观并发控制方法如版本控制或时间戳控制。每个事务在修改数据时先获取数据的版本信息或时间戳并在提交时检查数据是否发生变化如果发生变化则进行回滚或者重新尝试。使用事务隔离级别 设置合适的事务隔离级别如可重复读或串行化隔离级别以确保一个事务在读取和修改数据时不会被其他事务的更新所影响从而避免丢失更新问题。应用程序设计 在应用程序设计阶段尽量避免长时间持有数据库连接或事务减少并发操作的可能性从而减少丢失更新问题的发生。 总结 丢失更新问题在并发事务处理中是一个常见的挑战但通过合适的并发控制机制和事务管理策略可以有效地解决这一问题确保数据的一致性和完整性。数据库管理员和开发人员需要充分了解丢失更新问题的原因和解决方法并在设计和实现数据库系统时采取相应的措施以提高系统的稳定性和可靠性。 死锁Deadlock 两个或多个事务相互等待对方释放资源导致系统无法继续执行。这种情况下只能通过终止其中一个事务或者回滚来解决死锁。 产生原因 资源竞争 多个事务同时请求获取相同的资源但由于资源被其他事务占用而无法立即获取导致事务之间相互等待。循环等待 事务之间存在循环的资源依赖关系每个事务都在等待其他事务所持有的资源形成了循环等待的局面。 解决方案 加锁顺序 设计良好的应用程序应该按照相同的顺序请求和释放资源从而降低死锁发生的可能性。通过统一的加锁顺序可以减少资源竞争和循环等待的情况。 超时机制 引入超时机制当事务在一定时间内无法获取所需资源时自动释放已经获取的资源并进行回滚操作从而打破死锁的局面。 检测和回滚 实现死锁检测算法定期检测系统中是否存在死锁并采取自动回滚或者手动干预的方式来解除死锁。 事务监控 监控事务的执行情况及时发现可能导致死锁的事务并对其进行优化或者调整从而降低死锁的发生概率。 总结 死锁是数据库并发处理中的一个重要问题需要引起开发人员和数据库管理员的高度重视。通过合理设计事务和加锁机制、实现死锁检测和处理算法以及进行事务监控和优化可以有效地预防和解决死锁问题确保数据库系统的稳定性和可靠性。 不可重复读Unrepeatableread) 一个事务在读取某个数据后另一个事务修改了该数据并提交。当第一个事务再次读取同一数据时得到的结果与之前不一致。因此称为不可重复读。 产生原因 并发事务更新 当一个事务在读取数据后另一个事务对同一行数据进行了更新操作导致第一个事务在后续读取同一行数据时得到了不一致的结果。并发事务删除 当一个事务在读取数据后另一个事务对同一行数据进行了删除操作导致第一个事务在后续读取同一行数据时发现数据已经不存在了。 解决方案 使用合适的事务隔离级别 将数据库的事务隔离级别设置为合适的级别如可重复读Repeatable Read或串行化Serializable这样可以确保一个事务在读取数据时不会受到其他事务的更新或删除操作的影响从而避免不可重复读问题的发生。 加锁 在进行读取操作时可以使用行级锁或表级锁来锁定数据防止其他事务对数据进行修改或删除确保读取到的数据是一致的。 优化事务设计 在设计应用程序时尽量减少事务的持续时间缩短事务执行的时间窗口从而减少并发操作对数据的影响。 总结 不可重复读问题可能导致系统产生不一致的结果因此在设计和实现数据库系统时必须采取适当的措施来防止不可重复读的发生。通过设置合适的事务隔离级别、加锁以及优化事务设计可以有效地避免不可重复读问题确保系统的数据一致性和完整性。 幻读Phantom read 幻读与不可重复读类似它发生在一个事务T1读取了几行数据接着另一个并发事务T2)插入了一些数据时。在随后的查询中第一个事务T1就会发现一些原本不存在的记录就好像发生了幻觉一样所以称为幻读。 产生原因 并发事务插入或删除 当一个事务在查询数据后另一个事务对相同的条件的数据进行了插入或删除操作导致第一个事务在后续查询相同条件的数据时发现了新增或减少的数据产生了幻读现象。 并发事务更新 当一个事务在查询数据后另一个事务对相同条件的数据进行了更新操作导致第一个事务在后续查询相同条件的数据时发现了数据内容的改变也会产生幻读问题。 解决方案 使用合适的事务隔离级别 将数据库的事务隔离级别设置为合适的级别如串行化Serializable这样可以确保一个事务在读取数据时不会受到其他事务的插入、更新或删除操作的影响从而避免幻读问题的发生。 使用行级锁或范围锁 在进行查询操作时可以使用行级锁或范围锁来锁定数据防止其他事务对数据进行插入、更新或删除操作确保查询到的数据集是一致的。 优化事务设计 在设计应用程序时尽量减少事务的持续时间缩短事务执行的时间窗口从而减少并发操作对数据的影响降低出现幻读问题的可能性。 总结 幻读问题可能导致系统产生不一致的结果因此在设计和实现数据库系统时必须采取适当的措施来防止幻读的发生。通过设置合适的事务隔离级别、使用锁机制以及优化事务设计可以有效地避免幻读问题确保系统的数据一致性和完整性。不可重复度和幻读的区别不可重复读的重点是修改幻读的重点在于新增或者删除。 例1同样的条件, 你读取过的数据, 再次读取出来发现值不一样了 事务1中的A先生读取自己的工资为 1000的操作还没完成事务2中的B先生就修改了A的工资为2000导 致A再读自己的工资时工资变为 2000这就是不可重复读。例2同样的条件, 第1次和第2次读出来的记录数不一样 假某工资单表中工资大于3000的有4人事务1读取了所有工资大于3000的人共查到4条记录这时事务2 又插入了一条工资大于3000的记录事务1再次读取时查到的记录就变为了5条这样就导致了幻读。 Spring声明式事务中的事务隔离isolation 事务隔离级别解决的是多个事务同时调用数据库的问题 DEFAULT默认值 READ_COMMITTED读已提交 允许读取并发事务已经提交的数据可以阻止脏读但是幻读或不可重复读仍有可能发生。 READ_UNCOMMITTED读未提交 最低的隔离级别允许读取尚未提交的数据变更可能会导致脏读、幻读或不可重复读 REPEATABLE_READ可重复读 对同一字段的多次读取结果都是一致的除非数据是被本身事务自己所修改可以阻止脏读和不可重复读但幻读仍有可能发生。 SERIALIZABLE可串行化 最高的隔离级别完全服从ACID的隔离级别。所有的事务依次逐个执行这样事务之间就完全不可能产生干扰也就是说该级别可以防止脏读、不可重复读以及幻读。 √会出现×不会出现 隔离级别脏读不可重复读幻影读READ-UNCOMMITTED√√√READ-COMMITTED×√√REPEATABLE-READ××√SERIALIZABLE××× 补充 MySQL InnoDB 存储引擎的默认支持的隔离级别是 REPEATABLE-READ可重读需要注意的是与 SQL 标准不同的地方在于InnoDB 存储引擎在 REPEATABLE-READ可重读 事务隔离级别下允许应用使用 Next-Key Lock 锁算法来避免幻读的产生。这与其他数据库系统(如 SQL Server)是不同的。所以说虽然 InnoDB 存储引擎的默认支持的隔离级别是 REPEATABLE-READ可重读 但是可以通过应用加锁读例如 select * from table for update 语句来保证不会产生幻读而这个加锁度使用到的机制就是 Next-Key Lock 锁算法。从而达到了 SQL 标准的 SERIALIZABLE(可串行化) 隔离级别。因为隔离级别越低事务请求的锁越少所以大部分数据库系统的隔离级别都是READ-COMMITTED(读取提交内容):但是你要知道的是InnoDB 存储引擎默认使用 REPEATABLE-READ可重读 并不会有任何性能损失。InnoDB 存储引擎在 分布式事务 的情况下一般会用到SERIALIZABLE(可串行化) 隔离级别。 事务属性 timeout事务超时时间允许事务运行的最长时间以秒为单位。默认值为-1表示不超时read-only事务是否为只读默认值为falserollback-for设定能够触发回滚的异常类型 Spring默认只在抛出runtime exception时才标识事务回滚可以通过全限定类名指定需要回滚事务的异常多个类名用逗号隔开 no-rollback-for设定不触发回滚的异常类型 Spring默认checked Exception不会触发事务回滚可以通过全限定类名指定不需回滚事务的异常多个类名用英文逗号隔开 属性类型说明propagation枚举型Propagation可选的传播性设置。使用举例Transactional(propagationPropagation.REQUIRES_NEW)isolation枚举型Isolation可选的隔离性级别。使用举例Transactional(isolationIsolation.READ_COMMITTED)readOnly布尔型是否为只读型事务。使用举例Transactional(readOnlytrue)timeoutint型以秒为单位事务超时。使用举例Transactional(timeout10)rollbackFor一组 Class 类的实例必须是Throwable的子类一组异常类遇到时 必须 回滚。使用举例Transactional(rollbackFor{SQLException.class})多个异常用逗号隔开rollbackForClassName一组 Class 类的名字必须是Throwable的子类一组异常类名遇到时 必须 回滚。使用举例Transactional(rollbackForClassName{“SQLException”})多个异常用逗号隔开noRollbackFor一组 Class 类的实例必须是Throwable的子类一组异常类遇到时 必须不 回滚noRollbackForClassName一组 Class 类的名字必须是Throwable的子类一组异常类名遇到时 必须不 回滚
http://www.pierceye.com/news/586005/

相关文章:

  • 网站左侧图片悬浮代码常州工厂网站建设
  • 智慧团建网站怎么转团关系app制作开发小程序制作开发
  • 誉字号网站wordpress 展示模板下载
  • 网站不接入备案成都市建设工程质量协会网站
  • 企业网站html网站开发济南招聘
  • 网站html优化方法音乐网站开发参考文献
  • 网站建设及推广方案ppt模板微信小程序开发工具下载哪个版本
  • 固安县城乡和住房建设局网站科技公司手机端网站
  • 寿光网站建设思科企业网络拓扑图
  • 中国建设银行河南省分行网站建筑人才服务中心官网
  • 响应式app网站模板单页淘宝客网站2014年行吗
  • 西安网站推广优化高端定制网站开发设计建站流程
  • m版网站开发公司如何做网络推广营销
  • 济宁商城网站开发设计网址源码在线查看
  • 网站建设公司介绍百度电脑怎么用wordpress
  • 宛城区网站建设广东seo推广方案
  • 北京建网站定制价格网站风格总结
  • 如何建设一个购物网站wordpress 优酷插件
  • 你们网站做301网站开发规模和工作量的计算
  • 班级网站建设甘肃住房和城乡建设厅网站
  • 网站建设哪家性价比高住房和城乡建设部网站办事大厅里边
  • 外贸小语种网站建设深圳市保障性住房申请官网
  • 阿里云买域名后怎么做网站wordpress创建空白页面
  • 小型公司建网站腾讯风铃wordpress
  • 广州做模板网站的公司怎么区分营销型和展示型的网站
  • 网站推广服务外包1688阿里巴巴国际站首页
  • 深圳学校网站建设wordpress rossi 汉化
  • 课程网站课程资源建设北京吴勇设计工作室
  • 网站建设费用什么意思软件制作专业
  • 扬中本地网站外国做美食视频网站