RowVersion字段从SqlServer到PostgreSQL的迁移
SQL Server 有個列是rowversion,之前是timestamp,因此這兩個關鍵字在SQL server中是同義詞,不過目前timestamp處在廢棄階段,因此我們最好使用rowversion來代替它。而在數據庫遷移時,因為使用到該類型,因此要考慮怎么遷移它。
📢歡迎點贊 :👍 收藏 ?留言 📝 如有錯誤敬請指正,賜人玫瑰,手留余香!
📢本文作者:由webmote 原創,首發于 【CSDN】
📢作者格言:生活在于折騰,當你不折騰生活時,生活就開始折騰你,讓我們一起加油!💪💪💪
1. SQL Server中 RowVersion的含義
Timestamp/rowversion 是一個EF Core屬性,在每次插入或更新數據行時,數據庫會自動為其生成新值。
因此此屬性也被視為并發標記,這確保了在你查詢行后,如果正在更新的行發生了更改,則會出現異常。可以參考之前的數據庫樂觀鎖介紹。
對于 SQL Server,通常使用?byte []?屬性,該屬性將設置為數據庫中的?ROWVERSION?列。
代碼如下:
public class Blog {public int BlogId {get; set; } public string Url { get; set; }1701698640public byte[] Timestamp { get; set; } }當然也可以是在 OnModelCreating 內設置
internal class MyContext : DbContext {public DbSet<Blog> Blogs { get; set; }protected override void OnModelCreating(ModelBuilder modelBuilder){modelBuilder.Entity<Blog>().Property(p => p.Timestamp).IsRowVersion();} }public class Blog {public int BlogId { get; set; }public string Url { get; set; }public byte[] Timestamp { get; set; } }注意:?如果需要映射到ulong,需要使用轉換函數HasConversion:
modelBuilder.Entity<Blog>().Property(p => p.Timestamp).IsRowVersion().HasConversion<int>();在SQL Server里,RowVersion是一種自增的只用于定義數據表的列類型,其值占用的大小是固定的8個字節,是SQL Server數據庫自動生成的、數據庫級別唯一的、二進制數字,使用binary(8)存儲。
1.1 遞增原理介紹
每個數據庫都有一個自增的計數器,該計數器是Database RowVersion,在用戶對有RowVersion 字段的數據表執行插入或修改命令時,該計數器就會增加。
可以使用全局變量?@@DBTS?進行查詢其值, 該值在整個數據庫中是唯一的、遞增的,不可回滾的。
select @@DBTS;當然對于一個數據表,最多有一個RowVersion 字段。
1.2 RowVersion字段的特性
每個數據庫只有一個計數器,因此所有擁有RowVersion字段的數據表,其值都是不同的;
數據庫的RowVersion 只會遞增,不會回滾;
由數據庫自動賦值(插入,修改),不能顯式賦值;
2. PostgreSQL 有無Timestamp/RowVersion
PostgreSQL中具有Timestamp類型,其是日期時間字段,并不能直接轉為SQL Server的RowVersion/Timestamp類型。
與RowVersion行為最為接近的列類型,是PostgreSQL中用于MVCC管理的 xmin隱藏列,這個列每個表系統都會自動建立,因此無需增加。當然還有其他隱藏列,比如xmax,xmin表示插入該表的事務號,xmax表示刪除該表的事務號。
唯一的瑕疵是使用xmin作為行版本標識不能區別同一個事務內的兩次、多次修改。當然事務內的第一次修改對其他事務不可見,唯一能看見它的只有修改這一行的事務自己。
在EF中我們可以采用下列實體定義,以便支持xmin列。
1701698640 [DatabaseGenerated(DatabaseGeneratedOption.Computed)] [Column("xmin", TypeName = "xid")] public uint Rowversion { get; set; }當然,也可以在OnConfiguring里寫語句。
builder.Entity<EmailAddressValidation>() .Property(e => e.RowVersion).IsRowVersion().HasColumnName("xmin").HasConversion<int>();檢查數據庫數據,OK,是那么的回事了。
3. 小結
rowversion字段還是挺有意思的,你學廢了嗎?
👓都看到這了,還在乎點個贊嗎?
👓都點贊了,還在乎一個收藏嗎?
👓都收藏了,還在乎一個評論嗎?
總結
以上是生活随笔為你收集整理的RowVersion字段从SqlServer到PostgreSQL的迁移的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ASP.NET Core 跨平台图形验证
- 下一篇: 推荐Mongodb GUI 可视化管理工