事务属性和线程实现



  1. 两种主要的事务ID类型:全局ID和本地ID。事务管理器分配全局ID,当一个事务需要多个事务资源参与时候需要全局ID。如果资源管理器也分配事务ID,那么它们是与此全局事务ID相关联的本地ID,因为它们指向同一个事务。
  2. 链式事务,应用程序执行的事务序列形成一个链,一个事务接一个事务的执行,中间没有间隔。非链式模型,程序完成一个事务后,不需要立即开始执行一个事务,例如可以使用start开始一个事务,commit/rollback提交或者回滚一个事务方式,显示定义每个事务的开始和结束。
  3. 事务属性:
    1. requires new:每个方法调用都在新的事务中开始执行,不管调用者是否在已经在事务中执行,
    2. required:如果调用已经在事务中运行,则被调用的方法也在此事务中执行,如果调用者未在事务中运行,那么被调用方法开始在新事务中执行。
    3. supported:如果调用者已经在事务中运行,则被调用方法在此事务中执行,如果调用者被在事务中运行,那么被调用方法不在事务中执行。
    4. noe supported:被调用方法不在事务中执行,即使创建此对象的程序正在事务中运行。
  4. 影响TP系统体系的因素:
    1. 组件是否共享地址空间。
    2. 此地址空间是否有多个线程中的一个线程在执行。
    3. 是否有硬件、操作系统或者语言机制保护一个地址空间的程序,避免不适当的修改彼此的内存。
  5. 实现线程:
    1. 中间件线程,操作系统并不知道线程,而是当做一个普通的进程。这里有一个技术难题,就多线程中执行的事务服务器试图从磁盘读取数据或者试图读取通信消息,并且它需要的数据还不可用,那么操作系统一般会使进程处于睡眠。如果只有一个线程,那么正如锁希望的--使进程处于睡眠状态,直到它有事做。如果在进程中的多线程运行,则所有的线程,进而所有的客户端都会有延迟,这不是好事情,并且这里会存在2级调度,操作系统调度进程,事务中间件正在调度线程,可能存在调度中存在的问题而导致事务失败或者其他问题。
    2. 操作系统线程,如果操作系统支持多线程,那么操作系统会跟踪所有的线程,当线程发起IO操作,操作系统使线程处于睡眠状态,操作系统能够识别什么时候可以调用线程,并调用做好执行准备的另一个线程,而不是使整个进程处于睡眠状态,这样减少了上下文切换。如果是SMP多处理器或者多喝处理器运行,则它可以使用并发,不同的线程分配到不同的core上运行。当然,这也有性能的开销,操作系统设计线程切换和系统调用,一般比进程切换开销小,但是比用户态的线程操作更昂贵。第二个问题,就是,内存保护问题,多线程运行在相同的进程空间中,线程之间只有很少或者没有内存保护,线程执行的错误会潜在的危害整个进程的内存。
    3. 服务器类,当多线程操作系统进程不可用时,可以选择一组进程模仿一组线程,每个进程有自己的内存空间,互相独立,有很强的内存保护的效果。由于进程是单线程的,即使同步IO操作期间发生阻塞,是进程处于睡眠状态,没有什么关系。由于服务器类中进程的失败是彼此独立的,因为其他进程继续运行,如果在多线程进程中,一个线程的故障会影响整个进程,尤其是此线程破坏了其他线程的内存。但是单进程单线程方式,存在2个问题,第一个问题是如果进程开的太多,上下午切换频繁,工作的状态并不理想。第二个问题,就是负载均衡,如何保持一些进程很繁忙,一些进程很闲。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值