扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流
一、事务的基础知识
创新互联是一家集网站建设,江津企业网站建设,江津品牌网站建设,网站定制,江津网站建设报价,网络营销,网络优化,江津网站推广为一体的创新建站企业,帮助传统企业提升企业形象加强企业竞争力。可充分满足这一群体相比中小企业更为丰富、高端、多元的互联网需求。同时我们时刻保持专业、时尚、前沿,时刻以成就客户成长自我,坚持不断学习、思考、沉淀、净化自己,让我们为更多的企业打造出实用型网站。数据库事务:复杂的事务要分步执行,要么整体生效、要么整体失效。
必须满足:原子性、一致性、隔离性、持久性。
数据并发问题:脏读:A读取了B未提交的更改数据。
不可重复读:A两次读,第二次读到了B已经提交的数据。(行级锁)
幻读(虚读):A读取B新提交的新增数据。(需添加表级锁)
第一类丢失更新:A撤销时恢复原数据把B提交的数据覆盖了。
第二类丢失更新:A提交时覆盖了B已经提交的数据。
数据库锁机制:一般分为表锁和行锁,按并发来分有共享锁和独占锁。数据库必须在更改的行上施加独占锁;行共享锁、行独占锁、表共享锁、表共享行独占锁、表独占锁。
事务隔离级别:
6.JDBC对事务的支持
二、ThreadLocal
概念:ThreadLocal是保存线程本地化的容器,为每个使用该变量的线程分配一个独立的变量副本。
原理:通过Map来保存每个线程的变量副本,key为线程对象,值为线程的副本。
在spring中大部分Bean都可以声明为singleton,故而spring要对这些非线程安全bean采用Threadlocal进行封装,这样有状态的bean就能够以sigleton的方式在多线程中正常工作。spring通过Threadlocal来实现事务管理
三、spring对事务的支持
spring封装了事务模版类TranscationTemplate.
事务管理主要有3个接口:PlatformTransactionManager,TransactionDefinition,TransactionStatus.
TransactionDefinition:用于描述事务的隔离级别、超时时间、等事务属性;
PlatformTransactionManager根据TransactionDefinition提供的事务属性来创建事务;就三个方法getTransaction、commit、rollback;
TransactionStatus描述激活事务的状态;
3.spring把事务管理委托给底层具体的持久化实现框架来完成,为不同的持久化框架提供了不同的PlatformTransactionManager接口的实现类。
Hibernate
1)Hibernate配置
hibernate.cfg.xml文件的主要作用就是配置了一个session-factory
在session-factory中主要通过property配置一些数据库的连接信息,我们知道,spring通常会将这种数据库连接用dataSource来表示,这样一来,hibernate.cfg.xml文件中的所有跟数据库连接的都可以干掉了,直接用spring的dataSource,而dataSource也可以用c3p0、dbcp等。
在session-factory中通过property除了配置一些数据库的连接信息之外,还有一些hibernate的配置,比如方言、自动创建表机制、格式化sql等,这些信息也需要配置起来。
还有最关键的一个持久化类所在路径的配置
2)spring的sessionFactroy配置
四、声明事务
1.基于aop/tx命名空间的配置:spring在Schema的配置中添加了一个tx命名空间,在配置文件中定义事务属性。
2.使用注解配置声明式事务
1)在xml中配置
2)在业务类上注解
@Service @Transactional public class BbtForum { public ForumDao forumDao; public TopicDao topicDao; public PostDao postDao; ...}3)@Transactional的属性
默认属性:
事务传播行为:PROPAGATION_REQUIRED
事务隔离级别:IOSLATION_DEFAULT
读写事务属性:读/写事务
超时时间:-1
回滚设置:热河运行期异常引发回滚、任何检查型异常不会引发回滚
4)spring要在具体的业务类上使用@Transactional注解
5)在方法处使用注解会覆盖类定义的注解,如果方法需要使用特殊的事务属性,可以在方法上使用注解
@Transactional(readOnly = true) public Forum getForum(int forumId) { return forumDao.getForum(forumId); }五、事务的一些注意点
1.使用不同的事务管理器
@Transactional("name")使用名为name的事务管理器
2.事务管理的目的是保证数据操作的事务性(原子性、一致性、隔离性、持久性)脱离了事务,DAO一样可以进行数据操作。
3.事务的传播性
PROPAGATION_REQUIERD:如果当前没有事务就创建一个,有就加进去
PROPAGATION_SUPPORTS:支持当前事务,没有就以非事务方式执行
PROPAGATION_MANDATORY:使用当前事务,没有就抛出异常
PROPAGATION_REQURES_NEW:新建事务,如果当前存在事务,就将其挂起
PROPAGATION_NOT_SUPPORTED:以非事务方式执行,如果当前有就挂起
PROPAGATION_NEVER:以非事务方式执行,如果有就挂起
PROPAGATION_NESTED:嵌套事务
相同线程中进行互相嵌套调用的事务方法工作在相同的事务中,如果在不同线程,则不同线程下事务方法工作在独立的事务中。
另外有需要云服务器可以了解下创新互联cdcxhl.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流