Web 技术研究所

我一直坚信着,Web 将会成为未来应用程序的主流

IE中indexedDB的事务生存周期问题

  从IE10开始,它就支持了indexedDB。但IE不愧是IE,总是变着花样坑爹。在其它浏览器中indexedDB的事务是在一个JavaScript消息运行结束时被释放的。而IE上虽然也会如此释放,但它的释放很不及时,在之后的消息中有时依然可以使用先前消息中的事务。
indexedDB.deleteDatabase("test"); //尝试删除已存在的同名数据库
(function(){
  //初始化数据库结构
  this.onupgradeneeded=function(){
    this.result.createObjectStore("myobj",{keyPath:"id"});
  };
  //成功打开数据库
  this.onsuccess=function(){
    var db=this.result,
    //为myobj存储对象创建一个可读写的事务
    transaction=db.transaction("myobj","readwrite");
    //试图在计时器消息中使用刚才创建的事务来写入数据
    setTimeout(function(){ //创建新的计时器消息来执行
      transaction.objectStore("myobj").put({id:0,n:"坑了个爹"});
    });
    //读取id为0的那条数据
    setTimeout(function(){
      db.transaction("myobj","readonly").objectStore("myobj")
      .get(0).onsuccess=function(){
        console.log(this.result&&this.result.n);
      };
    });
  };
}).call(indexedDB.open("test")); //打开数据库
  这个测试在Chrome和Firefox上毫无悬念地报错了。

  但在IE上会随机出现两种结果。

  这会造成的后果是一个事务如果没有从创建到释放都一直盯着,我们就很难保证这个事务可以正常使用,因为它可能是其它消息中创建的事务。在一些可能需要合并到同一个事务中的零散操作,我们可能就需要一个事务池来实现。而IE的这个特性导致了无法判断事务的可用性,给事务池的实现带来了一些麻烦。
网名:
3.80.32.*
电子邮箱:
仅用于接收通知
提交 悄悄的告诉你,Ctrl+Enter 可以提交哦
神奇海螺
[查看全部主题]
各类Web技术问题讨论区
发起新主题
本模块采用即时聊天邮件通知的模式
让钛合金F5成为历史吧!
次碳酸钴的技术博客,文章原创,转载请保留原文链接 ^_^