diff --git a/src/models/entities/note.ts b/src/models/entities/note.ts
index 176fc626b39a0e128083bae6fee2927b92ac4e99..6c7aebdd0d41ca82f89e9d881dbb2aeddbdce1b5 100644
--- a/src/models/entities/note.ts
+++ b/src/models/entities/note.ts
@@ -214,6 +214,14 @@ export class Note {
 	})
 	public renoteUserHost: string | null;
 	//#endregion
+
+	constructor(data: Partial<Note>) {
+		if (data == null) return;
+
+		for (const [k, v] of Object.entries(data)) {
+			(this as any)[k] = v;
+		}
+	}
 }
 
 export type IMentionedRemoteUsers = {
diff --git a/src/models/entities/poll.ts b/src/models/entities/poll.ts
index 894f07e68978714c149b3794a341b754b928a4d6..c0ad5547bdc64d47563ae4c1b67343b353832e6b 100644
--- a/src/models/entities/poll.ts
+++ b/src/models/entities/poll.ts
@@ -53,6 +53,14 @@ export class Poll {
 	})
 	public userHost: string | null;
 	//#endregion
+
+	constructor(data: Partial<Poll>) {
+		if (data == null) return;
+
+		for (const [k, v] of Object.entries(data)) {
+			(this as any)[k] = v;
+		}
+	}
 }
 
 export type IPoll = {
diff --git a/src/services/note/create.ts b/src/services/note/create.ts
index 9f79bf7a63c06880d3c1f10e2acc94668dd1c8bd..b66f61ae8e5c4352062f28699ce77919e62bf588 100644
--- a/src/services/note/create.ts
+++ b/src/services/note/create.ts
@@ -17,10 +17,10 @@ import extractMentions from '../../misc/extract-mentions';
 import extractEmojis from '../../misc/extract-emojis';
 import extractHashtags from '../../misc/extract-hashtags';
 import { Note } from '../../models/entities/note';
-import { Mutings, Users, NoteWatchings, Followings, Notes, Instances, Polls, UserProfiles } from '../../models';
+import { Mutings, Users, NoteWatchings, Followings, Notes, Instances, UserProfiles } from '../../models';
 import { DriveFile } from '../../models/entities/drive-file';
 import { App } from '../../models/entities/app';
-import { Not } from 'typeorm';
+import { Not, getConnection } from 'typeorm';
 import { User, ILocalUser, IRemoteUser } from '../../models/entities/user';
 import { genId } from '../../misc/gen-id';
 import { notesChart, perUserNotesChart, activeUsersChart, instanceChart } from '../chart';
@@ -349,7 +349,7 @@ async function publish(user: User, note: Note, reply: Note, renote: Note, noteAc
 }
 
 async function insertNote(user: User, data: Option, tags: string[], emojis: string[], mentionedUsers: User[]) {
-	const insert: Partial<Note> = {
+	const insert = new Note({
 		id: genId(data.createdAt),
 		createdAt: data.createdAt,
 		fileIds: data.files ? data.files.map(file => file.id) : [],
@@ -381,7 +381,7 @@ async function insertNote(user: User, data: Option, tags: string[], emojis: stri
 		renoteUserId: data.renote ? data.renote.userId : null,
 		renoteUserHost: data.renote ? data.renote.userHost : null,
 		userHost: user.host,
-	};
+	});
 
 	if (data.uri != null) insert.uri = data.uri;
 
@@ -397,19 +397,27 @@ async function insertNote(user: User, data: Option, tags: string[], emojis: stri
 
 	// 投稿を作成
 	try {
-		const note = await Notes.save(insert);
-
-		if (note.hasPoll) {
-			await Polls.save({
-				noteId: note.id,
-				choices: data.poll.choices,
-				expiresAt: data.poll.expiresAt,
-				multiple: data.poll.multiple,
-				votes: new Array(data.poll.choices.length).fill(0),
-				noteVisibility: note.visibility,
-				userId: user.id,
-				userHost: user.host
-			} as Poll);
+		let note: Note;
+		if (insert.hasPoll) {
+			// Start transaction
+			await getConnection().transaction(async transactionalEntityManager => {
+				note = await transactionalEntityManager.save(insert);
+
+				const poll = new Poll({
+					noteId: note.id,
+					choices: data.poll.choices,
+					expiresAt: data.poll.expiresAt,
+					multiple: data.poll.multiple,
+					votes: new Array(data.poll.choices.length).fill(0),
+					noteVisibility: note.visibility,
+					userId: user.id,
+					userHost: user.host
+				});
+
+				await transactionalEntityManager.save(poll);
+			});
+		} else {
+			note = await Notes.save(insert);
 		}
 
 		return note;